#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 #ifdefvà #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 #ifdefvà #ifndef, và đầu ra là gì?
Câu trả lời:
Văn bản bên trong một ifdef/endifhoặ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. ifdefcó nghĩa là "nếu điều sau được xác định" trong khi ifndefcó 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ị ifndefsai. 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 ifdefkhô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 endifdò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ỏ. #ifdefsẽ chỉ kiểm tra xem ký hiệu sau đã được xác định thông qua #definehoặ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 #ifnó 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 definedcho 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 #ifcấ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.