Vai trò của #ifdef và #ifndef


99
#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#ifndef, và đầu ra là gì?

Câu trả lời:


131

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 ");

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

68

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

0

"#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.


4
Tôi không chắc điều này bổ sung điều gì mà các câu trả lời khác chưa đề cập đến và ví dụ của bạn không phải là C hoặc C ++.
SirGuy

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.