作者热门文章
- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我们使用 VS 2008
有一个很大的枚举,里面有很多开发者
此枚举类型为 __int64(Microsoft 扩展),我想让编译器提示枚举中的非唯一值。
如果它是一个普通的枚举,我会这样做:
enum E1
{
E11 = 0x01F00,
E12 = 0x01F00,
E13
};
#pragma warning(push)
#pragma warning(error: 4061)
#pragma warning(error: 4062)
void F(E1 e1)
{
switch (e1)
{
case E11:
case E12:
case E13:
return;
}
}
#pragma warning(pop)
如果 E1 有 2 个相同的值,函数 F 会出错
如果开发人员忘记为 switch 添加新值,它会出现另一个错误
但我的枚举类型为 __int64(或 long long)
当我尝试对 E1 e1 执行相同的切换时,它会截断值并提示值,差异是 0x100000000 或 0x200000000 ....
如果我将 e1 转换为 __int64,如果开发人员忘记向开关添加新值(因此整个检查功能变得无用),编译器不会提示
问题:有人知道我能做些什么吗?或者 VS 2008(或 C++)可能有另一种工具来确保枚举:__int64 只有唯一值?
最佳答案
根据您的评论,我假设您在枚举本身中没有聚合(组合)标志。在那种情况下,您可以使用两个枚举来使出错变得更加困难。您仍然可以破坏编译器,但我认为这不是这里的真正问题。
enum Bit_Index
{
FLAG1_INDEX,
FLAG2_INDEX,
FLAG_FANCY_INDEX,
LAST_INDEX
};
#define DECLARE_BIT_VALUE(att) att##_VALUE = 1ULL << att##_INDEX
enum Bit_Value
{
DECLARE_BIT_VALUE(FLAG1),
DECLARE_BIT_VALUE(FLAG2),
DECLARE_BIT_VALUE(FLAG_FANCY),
// Declared NOT using the macro so we can static assert that we didn't forget
// to add new values to this enum.
LAST_BIT // Mainly a placeholder to prevent constantly having to add new commas with new ids.
};
#undef DECLARE_BIT_VALUE
然后在实现文件中使用 static_assert 以确保枚举不会错位:
// Make sure to the best of our abilities that we didn't mismatch the index/bit enums.
BOOST_STATIC_ASSERT((LAST_BIT - 1) == (1U << (LAST_INDEX - 1)));
关于C++:如何检查枚举只有唯一值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11263396/
我是一名优秀的程序员,十分优秀!