问题描述
||
当未在switch语句中处理所有可能的枚举值时,我想得到编译器警告或错误。当然,我可以添加一个带有断言的默认案例,并(最终)在运行时得到一个错误。但是我想在编译时出错。
我不确定C ++是否完全可以,但是也许有人知道一个窍门...
编辑:
使用ѭ0似乎是GCC的解决方案。 VS2010有类似的东西吗? (我没有使用GCC)。
编辑2:
好的,我找到了VC ++(VS2010)的解决方案:
当缺少值且未提供默认情况时,启用警告
C4062
会产生警告。
启用警告C4061
会在缺少值的情况下发出警告,即使提供了默认情况也是如此。
解决方法
您没有提到您正在使用哪个编译器。如果您使用的是GCC,则只需启用
-Wswitch
(ѭ4automatically自动启用)即可免费获得。
,AFAIK没有使用MSVC实现所需功能的常规方法。有一些技巧可以做类似的事情,但它们要么涉及复杂的模板伏都教,要么涉及真正的宏宏谜语。
例如,代替以常规方式定义枚举,请执行以下操作:
#define MyEnumEntries(m) \\
m(A,1) \\
m(B,2) \\
m(C,3) \\
enum Abc {
// the following will expand into your enum values definitions
# define M_Decl(name,value) name = value,MyEnumEntries(M_Decl)
};
现在,您的开关可以改写为:
Abc a = A;
switch( a )
{
#define M_Goto(name,value) \\
case value:
goto label_##name;
MyEnumEntries(M_Goto)
case label_A:
// TODO
break;
case label_B:
// TODO
break;
}
如果您不为所有枚举值添加开关条目label_...
,则以上内容将无法编译。
,如果您使用带有+4的g ++,那么您会得到它。
例如:
enum Abc
{
A =1,B,C
};
Abc a = A;
switch( a )
{
case A:
break;
case B:
break;
}
将引起警告。
但是最好使用断言失败的ѭ10'大小写,因为添加新的枚举值时,必须更改使用该枚举的所有文件。
,如果您用-Wall
启用所有警告,则g ++自动执行此操作。