簡體   English   中英

條件表達式中的常量值

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM