C/C++ Preprocessor – Constant và Conditional Inclusion

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:

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.

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

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.

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ụ:

Ở 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.

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:

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

Leave a Reply

Be the First to Comment!

Notify of
avatar
wpDiscuz