Boolean trong ifdef: “#ifdef A && B” có giống với “#if được định nghĩa (A) && được định nghĩa (B)” không?


83

Trong C ++, đây là:

#ifdef A && B

giống như:

#if defined(A) && defined(B)

?

Tôi đã nghĩ rằng nó không phải, nhưng tôi đã không thể tìm thấy sự khác biệt với trình biên dịch của mình (VS2005).


1
bản sao có thể có của: stackoverflow.com/questions/965700/… Tôi thấy rằng chúng là C và C ++, nhưng các bộ tiền xử lý về cơ bản giống nhau: stackoverflow.com/questions/5085533/…
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

Liệu ai đó sẽ trích dẫn và giải thích tiêu chuẩn để quyết định xem nó có hợp pháp hay không (nó không chắc hoạt động, nhưng nó nên biên dịch)? Tôi không thể sau 15 phút đọc chương "16 Chỉ thị tiền xử lý".
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

Câu trả lời:


91

Chúng không giống nhau. Cái đầu tiên không hoạt động (tôi đã thử nghiệm trong gcc 4.4.1). Thông báo lỗi là:

test.cc:1:15: cảnh báo: mã thông báo bổ sung ở cuối chỉ thị #ifdef

Nếu bạn muốn kiểm tra xem nhiều thứ đã được xác định chưa, hãy sử dụng cái thứ hai.


Cảm ơn vì đã kiểm tra. Tôi đang sử dụng trình biên dịch của Microsoft và có vẻ như nó cho phép, nhưng nó có vẻ không phù hợp với tôi.
criddell

2
Bạn không thể chứng minh mọi thứ bằng cách sử dụng một số trình biên dịch duy nhất. Tham khảo tiêu chuẩn, trong đó nói rằng điều này không hợp lệ.
Các cuộc đua ánh sáng trong quỹ đạo

@LightnessRacesinOrbit Tuy nhiên, một số trình biên dịch mở rộng tiêu chuẩn. Nói rằng "nó hoạt động trong một trình biên dịch nhất định" không phải là một nỗ lực để chứng minh nó hợp lệ; lưu ý rằng một trình biên dịch nhất định mở rộng tiêu chuẩn theo một cách nhất định.
Vụ kiện của Fund Monica vào

@QPaysTaxes: Đồng ý, nhưng câu trả lời này không làm được điều đó. Nó trả lời một câu hỏi bắt đầu "trong C ++ ...." với những gì dường như là một sự thật chung về C ++. Thoạt nhìn, Evan đã thử nghiệm lý thuyết của mình bằng một trình biên dịch sau đó cho rằng nó đúng cho tất cả, bằng cách đảm bảo từ chính ngôn ngữ. Nếu anh ta xác định rằng hành vi này là một phần mở rộng GCC và nói "đây là một phần mở rộng GCC" (có liên kết đến tài liệu tham khảo) thì điều đó sẽ ổn! (mặc dù không thực sự là câu trả lời cho câu hỏi cụ thể này)
Các cuộc đua ánh sáng trong quỹ đạo

1
Trong khi không có số xét nghiệm dương tính có thể "chứng minh" rằng nó hợp lệ, một tiêu cực duy nhất là đủ để chứng minh rằng nó không phải là, hoặc là nó là ít nhất là không khuyến khích sử dụng. Mặc dù việc tham khảo tiêu chuẩn sẽ rất tốt, nhưng việc chứng minh rằng nó không hoạt động trong ít nhất một trình biên dịch chính là bằng chứng đủ để nói rằng "nó không hoạt động" cho mục đích của cuộc thảo luận này.
zeel

48

Biên soạn có điều kiện

Bạn có thể sử dụng toán tử đã xác định trong chỉ thị #if để sử dụng các biểu thức đánh giá thành 0 hoặc 1 trong một dòng tiền xử lý. Điều này giúp bạn không sử dụng các chỉ thị tiền xử lý lồng nhau. Các dấu ngoặc đơn xung quanh mã định danh là tùy chọn. Ví dụ:

#if defined (MAX) && ! defined (MIN)  

Nếu không sử dụng toán tử đã xác định, bạn sẽ phải bao gồm hai lệnh sau để thực hiện ví dụ trên:

#ifdef max 
#ifndef min

2
Trong khi những gì bạn nói là chính xác, điều này không trả lời câu hỏi nào cả, anh ấy hỏi liệu hai người có giống nhau ... họ không.
Evan Teran

1
Tôi nghĩ rằng nó nói "chúng không giống nhau", bạn có thể thấy nó giải thích cách tạo một giá trị tương đương với #if được xác định (COND_A) && được xác định (COND_B), khác với #ifdef COND_A && COND_B
Svetlozar Angelov

Dù bằng cách nào, đây là một lưu ý hữu ích.
Paul Masri-Stone,

2

Các kết quả sau giống nhau:

1.

#define A
#define B
#if(defined A && defined B)
printf("define test");
#endif

2.

#ifdef A
#ifdef B
printf("define test");
#endif
#endif

1
Bạn có thể vui lòng thêm một số bình luận để mô tả cách này trả lời câu hỏi, nó không rõ ràng so với câu trả lời của bạn.
James Wood,

Câu trả lời này, mặc dù đúng về mặt kỹ thuật, nhưng không trả lời chính xác câu hỏi và ngụ ý cách sử dụng không chính xác. Trong khi hai khối sẽ làm điều tương tự, lồng hai ifs không giống như sử dụng &&. Các điều kiện khác, chẳng hạn như một #else, có thể gây ra sự cố. Chỉ có tùy chọn đầu tiên thực sự có nghĩa chính xác những gì người hỏi yêu cầu.
zeel

1

Đối với những người có thể đang tìm kiếm ví dụ (UNIX / g ++) hơi khác so với OP, điều này có thể giúp ích:

`

#if(defined A && defined B && defined C)
    const string foo = "xyz";
#else
#if(defined A && defined B)
    const string foo = "xy";
#else
#if(defined A && defined C)
    const string foo = "xz";
#else
#ifdef A
    const string foo = "x";
#endif
#endif
#endif
#endif

Tại sao không chỉ sử dụng #elif thay vì #else #if và một tỷ # endif ở cuối ...?
Elliott

-3

Tính đến VS2015 không có công trình nào ở trên hoạt động. Chỉ thị đúng là:

#if (MAX && !MIN)

xem thêm tại đây


2
Bạn đã liên kết đến tài liệu C #, không phải tài liệu C ++.
Revolver_Ocelot
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.