如何解决当不是所有的枚举值都在C ++的switch语句中处理时,编译时断言
|| 当未在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 ++自动执行此操作。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。