我刚刚意识到我引入了一个错误,让我惊讶的是它编译通过了,使用常量开关是合法的吗?
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;
}
我刚刚意识到我引入了一个错误,让我惊讶的是它编译通过了,使用常量开关是合法的吗?
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;
}
打开常量可能是有意义的,这并非不可能。考虑以下情况:
void f( const int x ) {
switch( x ) {
...
}
}
将文字常量作为开关很少有意义,但是是合法的。
编辑:仔细思考后,还是有一种情况可以使用文字常量作为开关:
int main() {
switch( CONFIG ) {
...
}
}
该程序是使用以下编译的:
g++ -DCONFIG=42 foo.cpp
不是所有对编译器有意义的东西都有意义!
以下内容也可以被编译,但没有意义:
if (false)
{
std::cout << "This is of course, imposible" << std::endl;
}
作为开发人员,发现这些问题取决于我们自己。
这种做法是合法的一个好理由是编译器可能会在编译时解析这个值,这取决于你处于开发的哪个阶段。
例如,在调试代码时,你可能会使用类似以下的方法:
int glyphIndex;
...
#if CHECK_INVALID_GLYPH
glyphIndex = -1;
#endif
switch (glyphIndex)
...
#if CHECK_INVALID_GLYPH
const int glyphIndex = -1;
#else
int glyphIndex = GetGlyph();
#endif
您不会真正想改变switch语句的主体,仅仅是为了做一些小修改,编译器完全有能力对代码进行优化,消除永远不会执行的部分。
是的,任何整数表达式都可以合法地进行切换。这与经常使用的使用函数返回的整数值进行switch的构造相同。
是的,但为什么你想要这样做(除非是调试)是另一回事。
这类似于if (0)
或while (true)
。