4

私が導入したバグに気付いたところです。驚いたのは、それがコンパイルされたことです。定数をオンにすることは合法ですか?

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

6 に答える 6

18

定数をオンにすることが理にかなっていることは不可能ではありません。検討:

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

ただし、リテラル定数をオンにすることはほとんど意味がありません。しかし、それは合法です。

編集:考えてみると、リテラルをオンにすることが完全に理にかなっている場合があります。

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

プログラムがコンパイルされた場所:

g++ -DCONFIG=42 foo.cpp
于 2009-05-19T11:52:54.927 に答える
16

コンパイラにとって意味のあることすべてが意味をなすわけではありません!

以下もコンパイルされますが、意味がありません。

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

これらを見つけるのは、開発者である私たち次第です。

于 2009-05-19T11:49:36.557 に答える
3

これが合法である理由の1つは、開発のどの段階にいるかによっては、コンパイラがコンパイル時に値を解決できる可能性があることです。

たとえば、デバッグに次のようなものを使用する場合があります。

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ステートメントの本体を変更する必要はありません。コンパイラーは、コードを完全に合理化して、実行されない部分を排除することができます。

于 2009-05-19T12:15:18.033 に答える
2

はい、合法です。​​​​​​​​​​​​​​

于 2009-05-19T11:48:23.267 に答える
2

はい、整数式をオンにすることは完全に合法です。switchこれは、関数によって返される整数値に対して ing を実行するのと同じです。これは、非常に頻繁に使用される構造です。

于 2009-05-19T11:48:38.570 に答える
2

はい、しかし、なぜ(デバッグを除いて)したいのかは別の問題です。

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

于 2009-05-19T11:50:09.050 に答える