C/C++ Preprocessor (Phần 1) - Constant và Conditional Inclusion
C
29
C++
30
C/C++
6
White

Võ Phi Hùng viết ngày 30/03/2017

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 copypaste 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 ifdefifndef ở 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 đó.

Phần 1 của series bài về Preprocessor kết thúc tại đây do tác giả cảm thấy đã hết khoái cảm. Hẹn các bạn ở bài tiếp theo về Preprocessor - bài tiếp theo mình sẽ trình bày về phần quan trọng nhất của Preprocessor đó là Macro.

Bình luận


White
{{ comment.user.name }}
Bỏ hay Hay
{{comment.like_count}}
Male avatar
{{ comment_error }}
Hủy
   

Hiển thị thử

Chỉnh sửa

White

Võ Phi Hùng

6 bài viết.
33 người follow
Kipalog
{{userFollowed ? 'Following' : 'Follow'}}
Cùng một tác giả
White
13 6
Bài này được mình dịch lại từ bài gốc ở đây. http://www.joelonsoftware.com/articles/fog0000000069.html Của tác giả Joel Spolsky thuộc công ty Netsc...
Võ Phi Hùng viết gần 3 năm trước
13 6
White
9 2
Khi làm quen với C hoặc C++ chắc bạn sẽ rất quen với mấy dòng kiểu như sau ở đầu và cuối mỗi file .h c++ ifndef _file_name_h define _file_name_h ...
Võ Phi Hùng viết gần 3 năm trước
9 2
White
8 2
Khái niệm macro và ví dụ Macro một cái tên nghe khá hổ báo, được dùng để chỉ những hàm được viết ở phần Preprocessor, thay vì đặt nó vào trong phầ...
Võ Phi Hùng viết gần 3 năm trước
8 2
Bài viết liên quan
Male avatar
0 0
Constructor của lớp cha luôn được gọi trước constructor của lớp con. class Foo { public: Foo() { cout << "Base class initializing" << endl; ...
baoquocphan viết hơn 1 năm trước
0 0
{{like_count}}

kipalog

{{ comment_count }}

bình luận

{{liked ? "Đã kipalog" : "Kipalog"}}


White
{{userFollowed ? 'Following' : 'Follow'}}
6 bài viết.
33 người follow

 Đầu mục bài viết

Vẫn còn nữa! x

Kipalog vẫn còn rất nhiều bài viết hay và chủ đề thú vị chờ bạn khám phá!