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

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

例如,你可能会使用这样的东西来调试东西:

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

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

于 2009-05-19T11:48:38.570 回答
2

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

它类似于if (0)or while (true)

于 2009-05-19T11:50:09.050 回答