在C ++中打开常量是否合法?

时间:2009-05-19 11:46:05

标签: c++ switch-statement

我刚刚意识到我引入的一个错误,令我感到惊讶的是它编译了,打开常量是否合法?

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;  
}

6 个答案:

答案 0 :(得分:18)

开启常数并不是不可能的。考虑:

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

然而,开启文字常量很少有意义。但这是合法的。

编辑:考虑到这一点,有可能会切换字面值 完美感:

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

程序编译时使用:

g++ -DCONFIG=42 foo.cpp

答案 1 :(得分:16)

并非所有对编译器有意义的事情都有意义!

以下也会编译,但没有意义:

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

由我们作为开发人员来发现这些。

答案 2 :(得分:3)

合法的一个很好的理由是编译器可能能够在编译时解析该值,具体取决于您所处的开发阶段。

E.g。你可能会用这样的东西来调试东西:

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语句的主体只是为了你可以做这样的小改动,并且编译器完全能够合理化代码以消除永远不会执行的部分。

答案 3 :(得分:2)

是的,这是合法的。  

答案 4 :(得分:2)

是的,打开任何整数表达式是完全合法的。它与switch函数返回的整数值相同 - 一个经常使用的构造。

答案 5 :(得分:2)

是的,但是为什么你想要(除非调试)是另一回事。

if (0)while (true)类似。