我刚刚意识到我引入的一个错误,令我感到惊讶的是它编译了,打开常量是否合法?
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;
}
答案 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)
类似。