C/C++ Preprocessor

C/C++ Preprocessor

Hằng số (Constant)

#define được dùng để định nghĩa hằng số trong preprocessor. Cách sử dụng như sau:

#define THREE 3

Sau câu lệnh này thì bất cứ chỗ nào có THREE trong code của bạn thì compiler sẽ thay nó thành 3 hết. Tuy nhiên, vì trình biên dịch ko hiểu cái 3 trên là số hay là chữ, là int hay float, nó chỉ đơn giản làm công việc copy và paste những gì đã được định nghĩa mà thôi. Thử xét tiếp ví dụ sau.

#define FOUR 3 + 1

Giả sử sau đó bạn dùng FOUR này như sau.

x = FOUR * 5;

thì kết quả của x lúc này sẽ không phải là 4 * 5 mà sẽ là 3 + 1 * 5 và kết quả trả về sẽ là 8 thay vì là 20, khác hẳn dự định của chúng ta.

Vì thế lúc dùng define để định nghĩa hằng số, thì tốt hơn hết là chúng ta nên thêm dấu ngoặc tròn () vào phần định nghĩa.

#define FOUR (3 +1)

thì lúc này câu lệnh sẽ an toàn hơn.

Các directive điều kiện (#ifdef, #ifndef, #if, #endif, #else and #elif)

#ifdef và #ifndef

ifdefifndef là viết tắt của if definedif not defined, nghĩa là chúng sẽ kiểm tra xem có thực hiện 1 đoạn code hay là bỏ qua nó bằng cách thông qua việc kiểm tra tình trạng của 1 cái macro nào đó đã được định nghĩa hay chưa. Ví dụ:

#ifdef SIZE
int table[SIZE];
#endif

Ở ví dụ trên. Đoạn code int table[SIZE] chỉ được dịch nếu như macro SIZE đã được định nghĩa trước đó, nếu không thì compiler sẽ bỏ qua và nhảy thằng đến endif.

Cách dùng của ifndef thì ngược lại hoàn toàn.

#ifndef SIZE
#define SIZE 100
#endif
int table[SIZE];

Trong đoạn code vừa rồi macro SIZE sẽ được kiểm tra xem là đã được định nghĩa ở đâu đó chưa. Nếu chưa thì sẽ thực hiện câu lệnh #define SIZE 100. Sau đó chương trình dịch tiếp như bình thường. Các bạn có thể xem thêm về việc dùng ifdef và ifndef ở bài viết về Include Guard

#if, #else và #elif

#if, #else and #elif (else if). Được dùng tương tự với các câu lệnh if else bình thường. Nhưng hãy nhớ rằng, vì đây là những câu lệnh ở Preprocessor nên các điều kiện theo sau if hoặc elif chỉ đánh giá được các constant expression mà thôi. (Xem cụ thể về constant expression ở đây. 1 ví dụ về các directive trên:

#if SIZE > 200
#undef SIZE
#define SIZE 200

#elif SIZE < 100
#undef SIZE
#define SIZE 100

#else
#undef SIZE
#define SIZE 150

#endif

Thử đoán xem chuyện gì sẽ xảy ra với đoạn code trên. Khi mà bạn cố đưa 1 macro chưa được định nghĩa là SIZE vào phần điều kiện của câu lệnh if đầu tiên. Sự thực là nếu 1 macro chưa được định nghĩa, compiler sẽ thay thế nó bằng 0. Vậy nên kết quả cuối cùng của các câu lệnh trên. Câu lệnh #define SIZE 100 sẽ được thực hiện và nhảy về câu lệnh endif ngay sau đó.

Từ Kipalog