2009-05-19 10 views
4

私はちょうど私が導入したバグを認識しました。私が驚いたことは、それがコンパイルされていることです。C++で定数を有効にすることはできますか?

Visual Studio 8とComeauはどちらもそれを受け入れます(警告なし)。

switch(42) { // simplified version, this wasn't a literal in real life 
    case 1: 
     std::cout << "This is of course, imposible" << std::endl; 
} 
+4

/W4でコンパイルすると、警告が出るはずです。 いつもW4でコンパイルすることをお勧めします;) –

+0

本当の質問に答えたので、これを答えに入れてください(どうしてそれが捕まえられなかったのですか)。 –

+1

W4で15年間コンパイルされていないW4を使用した15歳のコードベースのコンパイルにはいくつか問題があります。 –

答えて

18

定数をオンに切り替えることは意味がありません。考えてみましょう:

void f(const int x) { 
    switch(x) { 
    ... 
    } 
} 

リテラル定数をオンに切り替えることはほとんどできません。しかしそれは合法です。

編集:リテラルに切り替える場合があるそれを考えるには、 完璧な理にかなって:ため

g++ -DCONFIG=42 foo.cpp 
+0

+1素晴らしい例 – dubnde

+1

+1、良い例。また、テンプレートコードまたは生成されたコードは、そのような構造を容易に生成することができる。 –

2

はい、整数式をオンにすることは完全に正当です。これは、関数によって返された整数値にあるswitchと同じです。これはかなり頻繁に使用される構造体です。

16

コンパイラには意味をなさないものはありません。

以下もコンパイルが、意味がないでしょう。

if (false) 
{ 
    std::cout << "This is of course, imposible" << std::endl; 
} 

開発者はこれらを発見するとそれは私たち次第です。

+0

@Chris:#define DEBUG false ...そして後で... if(DEBUG){fprintf(stderr、 "DEBUG:あなたもここに入ることはできませんので、良い最適化コンパイラはこのブロック全体を削除します"} – corlettk

+0

私はそのようなコードが次のように悪用されているのを見てきました:for(false){end:....;} .... if(stuff)goto end;} –

2

はい、どうしても(デバッグしない限り)したいと思うのは別の問題です。

if (0)またはwhile (true)と似ています。

+4

while(true) – ChrisF

+0

while(true)は見た目に狂っていないかもしれないし、いくつかの構造の基礎を形成しているかもしれませんが、おそらくもっと良いアプローチがありますが、if(0)かif(false )なぜ?!キャンプ:) – Lazarus

+0

私はちょうどスイッチング/ループステートメントのリテラル/定数は珍しいではなかったことを示していた。 –

3

一つの良い理由:プログラムがコンパイルされた

int main() { 
    switch(CONFIG) { 
      ... 
    } 
} 

これは正当なことですが、開発の段階に応じてコンパイラがコンパイル時に値を解決できる可能性があります。

など。あなたはものをデバッグするために、このようなものを使用することがあります:

int glyphIndex; 
... 
#if CHECK_INVALID_GLYPH 
glyphIndex = -1; 
#endif 

switch (glyphIndex) 
    ... 

コンパイラがたglyphIndexがあると-1ここで特定のために知っているので、それは一定のと同じくらい良いことです。また、あなたはこのようにそれをコーディングすることがあります

#if CHECK_INVALID_GLYPH 
const int glyphIndex = -1; 
#else 
int glyphIndex = GetGlyph(); 
#endif 

あなたは本当にあなたがこのような小さな変更を加えることができるようにちょうどあなたのswitch文の本体を変更する必要がありますする必要はないだろう、とコンパイラは合理化の完全に可能ですとにかく実行されることのない部分を排除するコード。

関連する問題