我刚刚意识到我引入的一个错误,令我惊讶的是它编译了,打开常量是否合法?
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)
...
编译器肯定知道 glyphIndex 在这里是 -1,所以它和常量一样好。或者,您可以这样编码:
#if CHECK_INVALID_GLYPH
const int glyphIndex = -1;
#else
int glyphIndex = GetGlyph();
#endif
你不会真的想改变你的 switch 语句的主体,这样你就可以做一些小的改变,并且编译器完全有能力使代码合理化,以消除无论如何永远不会执行的部分。
是的,这是合法的。
是的,打开任何整数表达式都是完全合法的。它与对函数返回的整数值进行 ing 相同switch
- 一种经常使用的构造。
是的,但你为什么想要(除非调试)是另一回事。
它类似于if (0)
or while (true)
。