Trong một coding style question about infinite loops, một số người đã đề cập rằng họ thích kiểu (;;) vì kiểu (đúng) trong thời gian cho các thông báo cảnh báo trên MSVC về biểu thức điều kiện không đổi.Giá trị không đổi trong biểu thức điều kiện
Điều này làm tôi ngạc nhiên rất nhiều, vì việc sử dụng các giá trị không đổi trong biểu thức có điều kiện là một cách hữu ích để tránh #ifdef địa ngục. Ví dụ, bạn có thể có trong tiêu đề của bạn:
#ifdef CONFIG_FOO
extern int foo_enabled;
#else
#define foo_enabled 0
#endif
Và mã đơn giản có thể sử dụng một điều kiện và tin tưởng vào trình biên dịch để bõ mẫu âm chót mã chết khi CONFIG_FOO không được định nghĩa:
if (foo_enabled) {
...
}
Thay vì cần phải kiểm tra cho CONFIG_FOO mỗi khi foo_enabled được sử dụng:
#ifdef CONFIG_FOO
if (foo_enabled) {
...
}
#endif
mẫu thiết kế này được sử dụng tất cả thời gian trong hạt nhân Linux (ví dụ, bao gồm/linux/cpumask.h định nghĩa nhiều macr os đến 1 hoặc 0 khi SMP bị vô hiệu hóa và cho một cuộc gọi chức năng khi bật SMP).
Lý do cho cảnh báo MSVC đó là gì? Ngoài ra, có cách nào tốt hơn để tránh #ifdef địa ngục mà không phải tắt cảnh báo đó không? Hay nó là một cảnh báo quá rộng mà không nên được kích hoạt nói chung?
Điểm tốt. Đây là một lý do mà người ta thấy các so sánh "ngược" như "if (0 == x)" - nếu bạn bỏ lỡ một dấu =, trình biên dịch sẽ bắt được nó! – bog
Nếu đó là những gì nó muốn bắt, không phải nó chỉ bắt được (chuyển nhượng trong một điều kiện) thay vì cảnh báo chung hơn? – CesarB
Điều đó tạo ra một cảnh báo khác. Với VC++ nó là: Compiler Warning (cấp 4) C4706 gán trong biểu thức điều kiện – Ferruccio