2008-10-22 52 views
8

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?

Trả lời

10

Cảnh báo không tự động có nghĩa là mã đó là xấu, chỉ đáng ngờ.

Cá nhân tôi bắt đầu từ một vị trí cho phép tất cả các cảnh báo tôi có thể, sau đó tắt bất kỳ điều gì chứng minh gây phiền nhiễu nhiều hơn hữu ích. Đó là một trong đó cháy bất cứ lúc nào bạn đúc bất cứ điều gì để một bool thường là người đầu tiên đi.

2

Tôi tin rằng đó là để đón những thứ như

if(x=0) 

khi bạn có nghĩa là

if(x==0) 
+0

Đ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

+0

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

+1

Đ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

0

Một cách đơn giản để tránh những cảnh báo sẽ là:

#ifdef CONFIG_FOO 
extern int foo_enabled; 
#else 
extern int foo_enabled = 0; 
#endif 
+0

Bạn có chắc chắn rằng bạn có thể biến một biến và đồng thời cung cấp cho nó một giá trị? Điều gì xảy ra nếu nó được khởi tạo thành một giá trị khác mà nó được xác định? "static const int foo_enabled = 0;" sẽ là một lựa chọn tốt hơn. –

5

Tôi nghĩ lý do cho cảnh báo là bạn có thể vô tình có một biểu thức phức tạp hơn để đánh giá một hằng số mà không nhận ra nó. Giả sử bạn có một bản tuyên bố như thế này trong một tiêu đề:

const int x = 0; 

rồi sau này, xa khai của x, bạn có một điều kiện như:

if (x != 0) ... 

Bạn có thể không nhận thấy rằng đó là một hằng số biểu hiện.

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