#define one 0
#ifdef one
printf("one is defined ");
#ifndef one
printf("one is not defined ");
Trong điều này, vai trò của #ifdef
và #ifndef
, và đầu ra là gì?
#define one 0
#ifdef one
printf("one is defined ");
#ifndef one
printf("one is not defined ");
Trong điều này, vai trò của #ifdef
và #ifndef
, và đầu ra là gì?
Câu trả lời:
Văn bản bên trong một ifdef/endif
hoặc ifndef/endif
cặp sẽ được bộ xử lý trước để lại hoặc loại bỏ tùy thuộc vào điều kiện. ifdef
có nghĩa là "nếu điều sau được xác định" trong khi ifndef
có nghĩa là "nếu điều sau không được xác định".
Vì thế:
#define one 0
#ifdef one
printf("one is defined ");
#endif
#ifndef one
printf("one is not defined ");
#endif
tương đương với:
printf("one is defined ");
vì one
được định nghĩa nên giá trị ifdef
đúng và giá trị ifndef
sai. Nó không quan trọng nó được định nghĩa là gì . Một đoạn mã tương tự (tốt hơn theo ý kiến của tôi) sẽ là:
#define one 0
#ifdef one
printf("one is defined ");
#else
printf("one is not defined ");
#endif
vì điều đó xác định ý định rõ ràng hơn trong tình huống cụ thể này.
Trong trường hợp cụ thể của bạn, văn bản sau khi ifdef
không bị xóa vì one
được xác định. Văn bản sau khi ifndef
được xóa vì lý do tương tự. Sẽ cần phải có hai endif
dòng kết thúc tại một số thời điểm và dòng đầu tiên sẽ khiến các dòng bắt đầu được đưa vào lại, như sau:
#define one 0
+--- #ifdef one
| printf("one is defined "); // Everything in here is included.
| +- #ifndef one
| | printf("one is not defined "); // Everything in here is excluded.
| | :
| +- #endif
| : // Everything in here is included again.
+--- #endif
Ai đó nên đề cập rằng trong câu hỏi có một cái bẫy nhỏ. #ifdef
sẽ chỉ kiểm tra xem ký hiệu sau đã được xác định thông qua #define
hoặc bằng dòng lệnh hay chưa, nhưng giá trị của nó (trên thực tế là thay thế) là không liên quan. Bạn thậm chí có thể viết
#define one
trình biên dịch chấp nhận điều đó. Nhưng nếu bạn sử dụng #if
nó là một thứ khác.
#define one 0
#if one
printf("one evaluates to a truth ");
#endif
#if !one
printf("one does not evaluate to truth ");
#endif
sẽ cho one does not evaluate to truth
. Từ khóa defined
cho phép có được hành vi mong muốn.
#if defined(one)
do đó tương đương với #ifdef
Ưu điểm của #if
cấu trúc là cho phép xử lý tốt hơn các đường dẫn mã, hãy thử làm điều gì đó tương tự với cặp #ifdef
/ cũ #ifndef
.
#if defined(ORA_PROC) || defined(__GNUC) && __GNUC_VERSION > 300
"#if one" có nghĩa là nếu "#define one" đã được viết thì "#if one" được thực thi nếu không thì "#ifndef one" được thực thi.
Đây chỉ là Chỉ thị C Pre-Processor (CPP) tương đương với các câu lệnh nhánh if, then, else trong ngôn ngữ C.
tức là if {#define one} then printf ("một ước lượng là chân lý"); else printf ("một chưa được định nghĩa"); vì vậy nếu không có #define một câu lệnh thì nhánh khác của câu lệnh sẽ được thực thi.
Mã trông lạ vì printf không nằm trong bất kỳ khối chức năng nào.