2010-09-19 42 views

Trả lời

96

Văn bản bên trong một số ifdef/endif hoặc ifndef/endifpair sẽ bị bỏ lại hoặc xóa bởi bộ xử lý trước tùy thuộc vào điều kiện. ifdef có nghĩa là "nếu sau đây được xác định" trong khi ifndef có nghĩa là "nếu sau đây là không phải là được xác định".

Vì vậy:

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

từ one được định nghĩa như vậy ifdef là đúng và ifndef là sai. Bất kể nó được định nghĩa là gì . Một đoạn mã tương tự (tốt hơn trong quan điểm của tôi) về điều đó sẽ là:

#define one 0 
#ifdef one 
    printf("one is defined "); 
#else 
    printf("one is not defined "); 
#endif 

vì điều đó chỉ rõ mục đích 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 ifdef không bị xóa vì one được xác định. Văn bản sau khi ifndefbị xóa vì cùng một lý do. Sẽ cần phải có hai đóng endif dòng tại một số điểm và là người đầu tiên sẽ gây ra dòng để bắt đầu bị bao gồm một lần nữa, 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 
48

người nên đề cập đến rằng trong câu hỏi có một cái bẫy nhỏ. #ifdef sẽ chỉ kiểm tra nếu biểu tượng sau đã được xác định thông qua #define hoặc theo dòng lệnh, nhưng giá trị của nó (sự thay thế của nó trong thực tế) là không liên quan. Thậm chí bạn có thể viết

#define one 

trình biên dịch trước chấp nhận điều đó. Nhưng nếu bạn sử dụng #if thì đó là một điều 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ẽ cấp one does not evaluate to truth. Từ khóa defined cho phép nhận được hành vi mong muốn.

#if defined(one) 

Do đó, tương đương với #ifdef

Ưu điểm của #if xây dựng là để cho phép một xử lý tốt hơn các đường dẫn mã, cố gắng làm một cái gì đó như thế với cái cũ #ifdef/#ifndef cặp.

#if defined(ORA_PROC) || defined(__GNUC) && __GNUC_VERSION > 300 
0

"#if one" có nghĩa là nếu "#define one" được viết "#if one" được thực thi nếu không "#ifndef one" được thực hiện.

Đây chỉ là Chỉ thị tiền xử lý trước (CPP) tương đương với câu lệnh chi nhánh nếu, sau đó, khác trong ngôn ngữ C.

tức là nếu {#define one} rồi printf ("một đánh giá thành sự thật"); else printf ("không xác định"); 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 hiện.

+3

Tôi không chắc chắn điều này cho biết thêm rằng các câu trả lời khác chưa bao gồm và ví dụ của bạn không phải là C hoặc C++. – SirGuy

Các vấn đề liên quan