Các chỉ thị tiền xử lý #if có thể được lồng trong C ++ không?


84

Tôi có câu hỏi về chỉ thị Bộ xử lý trước trong c ++:

Ví dụ:

#ifndef QUESTION

//some code here

#ifndef QUESTION

//some code here

#endif

#endif

Chúng ta có thể sử dụng nó theo cách này không, và trình biên dịch C ++ có thể khớp với ifndefendiftheo đúng cách không?


1
Bạn có thể lồng các điều kiện và bạn có thể gọi một macro từ macro khác nhưng bạn không thể lồng trực tiếp các macro, ví dụ #define AAA #define XXX- nó sẽ không hoạt động chính xác.
SF.

2
một câu hỏi C vừa được đóng lại như một bản sao của câu hỏi này, tôi sẽ chỉ ra rằng các quy tắc cho bộ tiền xử lý C và C ++ là giống nhau, ít nhất là đối với câu hỏi này.
Keith Thompson

Câu trả lời:


112

Có, chúng tôi có thể. Câu #endiflệnh khớp với câu lệnh trước đó #if #ifdefhoặc #ifndefvv mà chưa có câu lệnh tương ứng #endif.

ví dụ

#if  ----------|
#if  -----|    |
#endif ---|    |
#endif --------|

chúng ta có hai #endif ở đây, vì vậy #endif đầu tiên sẽ khớp với #ifndef thứ hai?

Nó sẽ không khớp với cái trước đó; điều đó có nghĩa là chúng tôi không thể lồng chúng.
Fred Foo

49

Có, bạn có thể lồng #if/ #endifkhối. Một số kiểu mã hóa C sẽ yêu cầu bạn viết

#ifdef CONDITION1
# ifdef CONDITION2
# endif
#endif

sử dụng dấu cách để biểu thị mức độ lồng vào nhau.


5
+1 cho bit lồng nhau, đôi khi nó giúp ích rất nhiều cho sự rõ ràng.
André Caron

Tại sao bạn sẽ chèn không gian? tại sao không chỉ thụt các#ifdef
Jahid

3
Tôi thậm chí không biết khoảng trống giữa #và các chỉ thị tiền xử lý được cho phép. Cảm ơn rất nhiều cho mẹo đó!
AlexR

0

Trong mã của bạn, phần #ifndef CÂU HỎI sẽ bị hủy trừ khi bạn #undef CÂU HỎI.

Chúc may mắn!


Xin lỗi, đọc nhầm mẫu mã! Tôi nghĩ rằng nó bắt đầu bằng #ifdef QUESTION
bert-jan
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.