【发布时间】:2015-11-19 19:44:19
【问题描述】:
说,我们有
enum E
{
Foo = 0,
Bar = 1
};
现在,我们开始了
enum E v = ( enum E ) 2;
然后
switch ( v )
{
case Foo:
doFoo();
break;
case Bar:
doBar();
break;
default:
// Is the compiler required to honor this?
doOther();
break;
}
由于上面的开关处理枚举的每个可能列出的值,编译器是否允许优化掉上面的default 分支,或者在枚举值不在的情况下具有未指定或未定义的行为名单?
我期望 C 和 C++ 的行为应该是相似的,所以问题是关于这两种语言的。但是,如果在这种情况下 C 和 C++ 之间存在差异,那么也很高兴知道这一点。
【问题讨论】:
-
您希望用什么语言回答这个问题?据我所知,枚举在 C 和 C++ 中的工作方式不同。
-
我无法通过 MSVC 在 C 中编译
E v = ( E ) 2;。我收到“错误 C2065:'E':未声明的标识符”。我只能参考Foo和Bar。 -
@WeatherVane 这是因为 E 未定义为类型。要么你
typedef它,要么写enum E v = 2;。 -
如果
v在编译时已知为 2,编译器甚至可以将整个switch语句优化为仅调用doOther()... -
@ace:是的,有趣的部分是如果
switch在编译为.lib的函数中(未启用链接时优化),然后从链接@ 的代码中使用987654335@,因此编译器不知道将使用的实际值,只是它作为参数提供。任何编译器拥有完整信息的地方都会导致奇怪的优化,从而使一般情况无效。
标签: c++ c enums language-lawyer