[英]Constant value in conditional expression
在關於無限循環的編碼風格問題中 ,有些人提到他們更喜歡for(;;)樣式,因為while(true)樣式在MSVC上給出關於條件表達式是常量的警告消息。
這讓我感到非常驚訝,因為在條件表達式中使用常量值是避免#ifdef地獄的有用方法。 例如,您可以在標題中:
#ifdef CONFIG_FOO
extern int foo_enabled;
#else
#define foo_enabled 0
#endif
代碼可以簡單地使用條件並信任編譯器在未定義CONFIG_FOO時刪除死代碼:
if (foo_enabled) {
...
}
每次使用foo_enabled時都不必測試CONFIG_FOO:
#ifdef CONFIG_FOO
if (foo_enabled) {
...
}
#endif
這種設計模式一直在Linux內核中使用(例如,include / linux / cpumask.h在禁用SMP時將幾個宏定義為1或0,在啟用SMP時定義為函數調用)。
MSVC警告的原因是什么? 另外,有沒有更好的方法來避免#ifdef hell而不必禁用該警告? 或者這是一個過於廣泛的警告,一般不應該啟用?
警告不會自動意味着代碼很糟糕 ,只是看起來很可疑。
就個人而言,我從一個能夠啟用所有警告的位置開始,然后關閉任何證明比使用更令人討厭的警告。 任何時候你向一個布爾施放任何東西的那個人通常是第一個去的。
我認為警告的原因是你可能無意中有一個更復雜的表達式,在沒有意識到的情況下評估為常量。 假設你在標題中有這樣的聲明:
const int x = 0;
然后,遠離x的聲明,你有一個像這樣的條件:
if (x != 0) ...
您可能沒有注意到它是一個常量表達式。
我相信這是為了捕捉這樣的事情
if( x=0 )
當你的意思
if( x==0 )
避免警告的簡單方法是:
#ifdef CONFIG_FOO
extern int foo_enabled;
#else
extern int foo_enabled = 0;
#endif
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.