8

無限ループに関するコーディング スタイルの質問で、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 地獄を回避するより良い方法はありますか? それとも、一般的に有効にすべきではない過度に広範な警告ですか?

4

4 に答える 4

10

警告は、コードが悪いことを自動的に意味するわけではなく、疑わしいように見えるだけです。

個人的には、できる限りすべての警告を有効にする立場から始めて、有用というより煩わしいと判明した警告を無効にします。何かをブール値にキャストするたびに起動するものは、通常、最初に実行されます。

于 2008-10-22T03:57:48.450 に答える
5

警告の理由は、知らないうちに定数に評価されるより複雑な式をうっかり持っている可能性があるためだと思います。ヘッダーに次のような宣言があるとします。

const int x = 0;

その後、x の宣言とはかけ離れて、次のような条件があります。

if (x != 0) ...

これが定数式であることに気付かないかもしれません。

于 2008-10-22T03:54:11.890 に答える
2

私はそれが次のようなものをキャッチすることだと信じています

 if( x=0 )

あなたが意味したとき

 if( x==0 )
于 2008-10-22T03:49:43.740 に答える
0

警告を回避する簡単な方法は次のとおりです。

#ifdef CONFIG_FOO
extern int foo_enabled;
#else
extern int foo_enabled = 0;
#endif
于 2008-10-22T03:53:16.477 に答える