Chỉ Thị Tiền Xử Lý Trong C/c++

Cập nhật thông tin chi tiết về Chỉ Thị Tiền Xử Lý Trong C/c++ mới nhất ngày 20/09/2020 trên website Doisonggiaitri.com. Hy vọng nội dung bài viết sẽ đáp ứng được nhu cầu của bạn, chúng tôi sẽ thường xuyên cập nhật mới nội dung để bạn nhận được thông tin nhanh chóng và chính xác nhất. Cho đến thời điểm hiện tại, bài viết này đã đạt được 2,376 lượt xem.

Giới thiệu

Khi mới học về lập trình C/C++, tôi có viết một vài project đơn giản và được chạy thành công. Dù project chạy được nhưng mà có một vài đoạn tôi không hiểu như là #include <stdio.h> hay ví dụ như #define MAX 200 để làm gì? Tôi bắt đầu tìm hiểu về nó và tôi cứ nghĩ là mình đã hiểu hết và biết cách sử dụng nó, nhưng không thực sự như vậy. Cho đến khi tôi tham gia một khóa học về lập trình C++ của STDIO Training và được dạy về preprocessor directives (chỉ thị tiền xử lý), lúc đó tôi mới thực sự hiểu và biết cách sử dụng các chỉ thị tiền xử lý.

Tiền đề bài viết

Rất nhiều người bạn đã hỏi tôi về các chỉ thị tiền xử lý, và với các học viên khác của STDIO Training cũng vậy, ngoài ra còn được động viên bởi các bạn và giảng viên nên tôi viết bài này chia sẻ lại.

Chỉ thị tiền xử lý (preprocessor directives)

Chỉ thị tiền xử lý là những chỉ thị cung cấp cho trình biên dịch để xử lý những thông tin trước khi bắt đầu quá trình biên dịch. Tất cả các chỉ thị tiền xử lý đều bắt đầu với với # và các chỉ thị tiền xử lý không phải là lệnh C/C++ vì vậy không có dấu ; khi kết thúc. Để cho dễ chúng ta chia thành 3 nhóm chính đó là:

  • Chỉ thị bao hàm tệp (#include).
  • Chỉ thị định nghĩa cho tên (#define macro).

Chỉ thị bao hàm tệp (#include)

Ở nhóm này chỉ có một chỉ thị đó là #include.

Đây là chỉ thị cho phép chúng ta include một file khác vào file chúng ta đang viết.

Cú pháp 1:

#include <file_name>

Với cú pháp 1, bộ tiền xử lý sẽ tìm file_name có sẵn trong IDE(như Visual Studio) của bạn và chèn vào file mà chúng ta đang viết, nếu tìm không thấy file_name thì trình biên dịch sẽ báo lỗi. Các file có sẵn trong IDE như stdio.h, math.h, conio.h, ….

Ví dụ:

#include <stdio.h>

Cú pháp 2:

#include "file_name"

Khi sử dụng cú pháp 2, bộ tiền xử lý sẽ tìm file_name trong các thư mục trên máy tính của chúng ta, khi tìm không thấy thì tiếp tục tìm trong các file có sẵn trong IDE. Nếu tìm được file_name thì chèn file_name vào file đang thao tác, còn vẫn không tìm thấy file_name thì trình biên dịch sẽ báo lỗi.

Ví dụ:

#include "Hello.h"

Để hiểu bạn hình dung rõ hơn về cơ chế hoạt động của chỉ thị #include thì bạn theo dõi ví dụ sau đây.

Tôi có file Studen.h có nội dung như sau:

struct Student
{
	int		m_id;
	char*	m_name;
};

Trong file Doisonggiaitri.com tôi muốn sử dụng struct Student thì tôi phải #include “Student.h”.

//main.cpp
#include "Student.h"

int main()
{
	struct Student Nguyen;
	return 0;
}

Việc #include “Student.h” giống như việc chép tất cả các đoạn code trong file Student.h vào file main.cpp.

struct Student
{
	int		m_id;
	char*	m_name;
};

int main()
{
      struct Student Nguyen;
      return 0;
}

Chỉ thị định nghĩa cho tên (#define macro)

Ở nhóm này gồm các chỉ thị #define, #undef.

Chỉ thị #define

Chỉ thị #define không có đối số.

Cú pháp:

#define identifier replacement-list

Chỉ thị này có tác dụng thay thế tên (identifier) bằng một dãy kí tự sau nó, khi dãy kí tự thay thế quá dài và sang dòng mới thì có thể sử dụng dấu vào cuối dòng trước.

Ví dụ:

#define STDIO "stdio.vn" // định nghĩa cho STDIO

Trong hàm main ta thực hiện lệnh sau:

printf(STDIO); // tương đương với lệnh printf("stdio.vn");

Phạm vi của tên được định nghĩa bởi #define là lúc từ khi nó được định nghĩa cho đến cuối tệp.

Có thể dùng #define định nghĩa như tên hàm, một biểu thức, một đoạn chương trình bằng một tên, với cách sử dụng này thì chương trình của chúng ta sẽ ngắn gọn và dễ hiểu hơn.

Ví dụ:

#define output printf("stdio.vn");

Trong hàm main tôi thực hiện câu lệnh sau:

output;  // printf("stdio.vn");

Những điểm cần chú ý của chỉ thị #define cho cách sử dụng trên:

    Khi định nghĩa một biểu thức ta nên đặt nó trong trong cặp dấu ngoặc tròn.

Ví dụ:

#define SUM 5+8

Khi ta gán size = SUM không xảy ra vấn đề gì nhưng khi gán s ize = 5*SUM thì tương đương với size = 5*5+8 chứ không phải là size = 5*(5+8) như ta mong muốn. Vì thế nên ta dùng #define SUM(5+8) sẽ luôn đúng trong mọi trường hợp.

    Khi định nghĩa đoạn chương trình gồm nhiều câu lệnh thì ta nên đặt trong cặp ngoặc { và }.

Ví dụ:

#define HELLO { printf("Hello STDIOn"); printf("stdio.vn"); }

void main()
{
      bool x = true;
      if(x) HELLO;
}

Đoạn chương trình trên khi biên dịch sẽ theo như mong muốn của ta là khi x = true in ra màn hình:

Hello STDIO
stdio.vn

Khi gán x = false thì không in ra màn hình.

Nhưng khi ta bỏ ngoặc { và } thì đoạn code sẽ như sau:

#define HELLO  printf("Hello STDIOn"); printf("stdio.vn");

Thì ngay cả khi x = false thì vẫn in ra màn hình:

stdio.vn

Chỉ thị #define có đối số.

Ngoài cách sử dụng #define như trên, chúng ta còn có thể dùng #define để định nghĩa các macro có đối giống như hàm. Để rõ hơn thì bạn theo dõi ví dụ định nghĩa một macro tính tổng của 2 giá trị.

#define SUM(x,y) (x)+(y)

Khi đó câu lệnh

int z = SUM(x*2, y*3);

Được thay bằng

int z = (x*2) + (y*3);

Các điểm cần lưu ý:

  • Giữa macro và dấu ( không được tồn tại khoảng trắng.
  • Để tránh rủi ro không mong muốn thì khi viết các biểu thức định nghĩa cho macro, các đối tượng hình thức (như x và y ở ví dụ trên) thì nên có cặp ngoặc ( và ) bao quanh. Để minh họa cho điều này thì ta đến với ví dụ sau:
#define MUL(x,y) x*y

void main()
{
      printf("%d",MUL(5+3, 10));
}

Khi đó trình biên dịch thay MUL(5+3, 10) bằng 5+3*10 và ta nhận đáp án 35 thay vì 80 như ta mong muốn.

Chỉ thị #undef

Cú pháp:

#undefidentifier 

Khi ta cần định nghĩa lại một tênmà ta đã định nghĩa trước đó thì ta sử dụng #undef để hủy bỏ định nghĩa đó và sử dụng #define định nghĩa lại cho tên đó.

Ví dụ:

#define STDIO "Hello STDIO"      // Định nghĩa cho tên STDIO là "Hello STDIO"

#undef STDIO                     // Hủy bỏ định nghĩa cho tên STDIO

#define STDIO "Welcome to STDIO" // Định nghĩa lại cho tên STDIO là "Welcome to STDIO"

Chỉ thị biên dịch có điều kiện

Cú pháp:

#if constant-expression_1 // Đoạn chương trình 1 #elifconstant-expression_2 // Đoạn chương trình 2 #else //Đoạn chương trình 3 #endìf

Nếu constant-expression_1 true thì chỉ có đoạn chương trình 1 sẽ được biên dịch, trái lại nếu constant-expression_1 false thì sẽ tiếp tục kiểm ta đến constan-expression_2. Nếu vẫn chưa đúng thì đoạn chương trình trong chỉ thị #else được biên dịch .

Các constant-expression là biểu thức mà các toán hạng trong đó đều là hằng, các tên đã được định nghĩa bởi các #define cũng được xem là các hằng.

Một cách biên dịch có điều kiện khác đó là sử dụng #ifdef và #ifndef, được hiểu như là Nếu đã định nghĩa và Nếu chưa được định nghĩa.

Chỉ thị #ifdef.

#ifdefidentifier //Đoạn chương trình 1 #else //Đoạn chương trình 2 #endif

Nếu indentifier đã được định nghĩa thì đoạn chương trình 1 sẽ được thực hiện. Ngược lại nếu indentifier chưa được định nghĩa thì đoạn chương trình 2 sẽ được thực hiện.

Chỉ thị #indef

#ifndefidentifier      //Đoạn chương trình 1 #else      //Đoạn chương trình 2 #endif

Với chỉ thị #ifndef thì cách thức hoạt động ngược lại với #ifdef.

Ví dụ:

#ifdef    MAX                    // Nếu MAX đã được định nghĩa
         #undef MAX              // Hủy bỏ MAX
         #define MAX 100         // Định nghĩa lại MAX 

#else                            // Nếu MAX chưa được đinh nghĩa 
         #define MAX 1           // Định nghĩa MAX

#endif

Các chỉ thị điều kiện ở trên, thường được sử dụng cho việc xử lý xung đột thư viện khi chúng ta #include nhiều thư viện như ở ví dụ dưới đây:

Tôi có một file A.h.

//file A.h

      Source code B

Tôi cũng có các file B.h và C.h và 2 file này đều cần nội dung của file A.h, vì thế tôi #include “A.h” vào file B.h và C.h.

//file B.h
#include"A.h"

     Source code B
//file C.h
#include"A.h"

      Source code C

File Doisonggiaitri.com của tôi #include “B.h” và #include “C.h”, khi đó nội dụng file Doisonggiaitri.com trở thành.

//file main.cpp
#include"B.h"
#include"C.h"

      Source code file main

Chúng ta có thể hình dung file Doisonggiaitri.com như sau:

//file main.cpp
      //#inlude"B.h"
      Source code A
      Source code B    
      
      //#include"C.h"
      Source code A
      Source code C
      
      Source code file main

Như ta thấy nội dung file A.h sẽ được chép 2 lần sang file main.cpp, bởi vì khi ta #include “B.h” thì nội dung file B.h(có cả nội dung file A.h) đã được chép sang file main.cpp. Ta tiếp tục #include “C.h” thì nội dung file C.h (có cả nội dung file A.h) đã được chép sang file main.cpp. Vì thế, nội dung của file A.h được chép 2 lần trong file Doisonggiaitri.com và khi ta biên dịch thì trình biên dịch sẽ báo lỗi. Để khắc phục lỗi này thì tôi sử dụng chỉ thị #ifndef, #define vào trong file A.h.

#ifndef      __A_H__
#define      __A_H__

      Source code A

#endif    // __AH__

Khi đó nội dung file Doisonggiaitri.com chúng ta có thể hình dung:

//file main.cpp

//#include"B.h"
#ifndef      __A_H__
#define      __A_H__

      Source code A

#endif    // __AH__ 

      Source code B

//#include"C.h"
#ifndef      __A_H__ 
#define      __A_H__
 
      Source code A
 
#endif    // __AH__ 

      Source code C
      
      Source code file main

Cơ chế hoạt động:

  • Từ dòng 4-9: __A_H__ chưa được định nghĩa nên cho phép chép nội dung file A.h vào main.cpp.
  • Dòng 11: Nội dung file B.h.
  • Từ dòng 14-19: Ở trên __A_H__ đã được định nghĩa nên không cho phép chép nội dung file A.h vào main.cpp.
  • Dòng 21: Nội dung file C.h.

Liên quan

Ethernet Switch Có Chức Năng Gì? - Xem 20,988

Ethernet Switch có chức năng gì? Switch là một thiết bị chọn lựa đường dẫn để gửi frame đến đích, hoạt động ở Lớp 2 của mô hình OSI. Đôi khi Switch còn được gọi là Bridge đa port hay Hub chuyển mạch. Switch quyết định chuyển frame dựa trên ...


Oxit Axit Là Gì? Tính Chất Hóa Học Và Hướng Dẫn Bài Tập Oxit Axit - Xem 18,315

Oxit axit là các oxit khi tác dụng với nước sẽ tạo ra axit, tác dụng với kiềm tạo thành muối hóa học. Oxit axit thường là oxit của phi kim ứng với một axit hoặc kim loại có hóa trị cao. Vậy tính chất hóa học của oxit axit ...


Drama Là Gì ? Ý Nghĩa Của Từ Drama Trên Facebook Là Gì? - Xem 15,642

Xã hội ngày càng phát triển kéo theo nhiều trào lưu xuất hiện, các thuật ngữ, ngôn từ mới lạ ngày càng nhiều trên các mạng. Những nội dung, các câu chuyện có tính chất kịch tính, gay cấn kéo dài luôn dành được sự quan tâm của các bạn ...


Kimochi Yamate Là Gì? Ý Nghĩa Của I Cư Kimochi Yamete Trong Tiếng Nhật? - Xem 11,088

Kimochi Yamate hay i cư kimochi và i kư kimochi là những thuật ngữ, cụm từ được sử dụng khả phổ biến trong thời đại hiện nay. Nhưng bạn có thật sự hiểu được nghĩa của từ kimochi là gì? Ở bài viết dưới đây, Doisonggiaitri.com sẽ giải đáp toàn ...


Đa Dạng Sinh Học Là Gì? Nguyên Nhân, Biện Pháp Hạn Chế Suy Giảm Đa Dạng Sinh Học - Xem 10,395

Đa dạng sinh học là sự phong phú của nhiều nhiều dạng, loài và các biến dị di truyền của mọi sinh vật trong đời sống tự nhiên, sự đa dạng và phong phú này được chia làm nhiều cấp độ tổ chức sinh giới đặc biệt là với các ...


Giải Vbt Vật Lý Lớp 6 - Xem 10,098

Giải bài tập môn Vật lý 6 Giải VBT Vật lý lớp 6 – Bài 8: Trọng lực – Đơn vị lực là tài liệu tham khảo môn Vật lý 6 hay dành cho các em học sinh, giúp các em ôn tập và củng cố kiến thức đã học ...


Z Là Gì Trong Toán Học? - Xem 9,900

Bạn có từng nghe về tập hợp R trong toán học chưa? Hẳn là rất rất quen phải không? Dĩ nhiên rồi vì lớp 6 lớp 7 chúng ta được học cái này mà. Vậy Z là gì trong toán học nhỉ? “Tập hợp Z là tập hợp các số ...


Tb Là Gì Trên Facebook? - Xem 9,306

TB nghĩa là gì? TB là viết tắt của từ gì? TB là 1 từ viết tắt có rất nhiều nghĩa tiếng việt và tùy từng ngữ cảnh mà ta hiểu nó sẽ có nghĩa là gì, dưới đây là các nghĩa hay được sử dụng nhất của từ viết ...


Số Cvv/cvc Trên Thẻ Atm Vietcombank Là Gì? - Xem 8,910

Số Cvv/Cvc trên thẻ atm đang được rất nhiều chủ thẻ quan tâm. Nhất là với những người dùng thẻ atm Vietcombank. Vậy số Cvv/Cvc trên thẻ atm vietcombank là gì? Bị lộ có sao không? Số Cvv/Cvc trên thẻ atm vietcombank là gì? Không phải ai dùng thẻ atm ...


Mã Zip Iphone Là Gì? - Xem 8,415

Zip Code (mã zip) là một trong những khái niệm không quá xa lạ đối với thế hệ trẻ. Chúng liên quan trực tiếp tới quy trình giao – Nhận bưu kiện khi mua sắm online hay đặt hàng thông qua các ứng dụng giao dịch trực tuyến. Không chỉ ...


Đề xuất

Tìm Hiểu Về Keylogger Là Gì? - Xem 2,673

Keylogger là gì? Nhiều người có thể mơ hồ hiểu rằng keylogger là một thứ gì đó nguy hiểm có thể ghi lại mọi thao tác bấm phím, nhưng không phải ai cũng hiểu rõ về công cụ này. Chắc hẳn trong chúng ta, nhiều người ta không dưới 1 ...


Iso Là Gì? Nhiệm Vụ Của Iso? - Xem 2,178

ISO (International Organization for Standardization) là Tổ chức tiêu chuẩn hoá quốc tế. Được thành lập vào năm 1947, hiện nay có trên 150 quốc gia thành viên. Việt Nam gia nhập vào ISO năm 1977, là thành viên thứ 77 của tổ chức này. Bộ tiêu chuẩn ISO 9000 ...


Top 5+ Thuốc Giải Rượu Tốt Nhất Của Mỹ, Nhật, Hàn, Việt Nam [Đã Kiểm Chứng] - Xem 2,574

Trong cuộc đời mỗi người, dù ít hay nhiều sẽ có tối thiểu một lần phải đối mặt với những buổi tiệc tùng có rượu có bia. Dù bạn có cứng rắn đến đâu thì cũng có giây phút khó xử khiến bạn không uống không được. Với những người ...


Thuốc Acnotin 10 Trị Mụn Trứng Cá Có Tốt Không? Giá Bao Nhiêu? - Xem 3,069

Thứ Sáu, 14-09-2018 Chúng ta đều biết sản phẩm điều trị mụn rất đa dạng, vậy dùng thuốc Acnotin 10 trị mụn thì sao? Chúng tôi sẽ cung cấp cho bạn những thông tin cần và đủ về loại thuốc này. Thắc mắc từ độc giả: ” Da em trước ...


Các Hàm Logic Trong Excel: And, Or, Xor Và Not - Xem 4,158

Trong bài viết này, Blog Học Học Excel Online sẽ hướng dẫn cách sử dụng các hàm Logic And, Or, Xor và Not đồng thời đưa ra các công thức ví dụ để minh họa cho cách dùng của chúng. Tổng quan về hàm logic trong Excel Microsoft Excel cung ...


Bạn đang xem bài viết Chỉ Thị Tiền Xử Lý Trong C/c++ trên website Doisonggiaitri.com. Hy vọng những thông tin mà chúng tôi đã chia sẻ là hữu ích với bạn. Nếu nội dung hay, ý nghĩa bạn hãy chia sẻ với bạn bè của mình và luôn theo dõi, ủng hộ chúng tôi để cập nhật những thông tin mới nhất. Chúc bạn một ngày tốt lành!