微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

当不是所有的枚举值都在C ++的switch语句中处理时,编译时断言

如何解决当不是所有的枚举值都在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 举报,一经查实,本站将立刻删除。