给定一个枚举,如下所示:
enum Colours { RED, YELLOW, BLUE, NUM_COLOURS };
还有一些逻辑,比如:
switch (colour) {
case RED: /* ... */ break;
case YELLOW: /* ... */ break;
case BLUE: /* ... */ break;
}
大多数具有合理设置的编译器都会抗议NUM_COLOURS
是一个未处理的情况。 但是,这显然不是该特定值的使用方式,并且对其进行案例陈述将是无稽之谈。
有没有办法让 linter/编译器知道忽略该特定值是正确的和适当的? 或者一种在不将其包含在枚举中的情况下确定该值的方法?
这样做的标准抱怨方式是使用 [[maybe_unused]]
。可以在枚举值之后添加它:
enum A
{
B,
C [[maybe_unused]]
};
void f(A a)
{
switch (a)
{
case B: break;
}
}
不幸的是,编译器对此的支持并不好。Clang最近解决了一个错误来支持这一点,必须在即将发布的9.0.0版本中(预计在9月(。(https://bugs.llvm.org/show_bug.cgi?id=36231(GCC 和 MSVC 半年前不支持它,因为我不需要这些,从来没有记录过错误。
如果您希望其他编译器/linter 提供支持,则很可能必须为此记录错误。考虑到 Clang 中补丁的大小,我不希望它在其他工具中花费太多精力来支持这一点。
我认为@JVApen的答案是我一直在寻找的理想答案。 只是很遗憾,听起来它并没有被广泛实施。
在此期间,我意识到,由于我已经使用 X-Macros 为我的枚举构建字符串化名称,因此我可以使用相同的技术来计算值的数量,因此计数不会显示为枚举类型的一部分:
#define LIST_OF_COLOURS(X)
X(RED)
X(GREEN)
X(BLUE)
#define LIST_OF_FRUIT(X)
X(APPLE)
X(ORANGE)
X(TOMATO)
#define X_LIST(x) x,
#define X_STRING_LIST(x) #x,
#define X_COUNT(x) +1
#define COMPREHENSIVE_SETUP(n, l)
enum n { l(X_LIST) };
char const* n##Names[] = { l(X_STRING_LIST) };
enum { n##Count = 0 l(X_COUNT) };
COMPREHENSIVE_SETUP(Colour, LIST_OF_COLOURS)
COMPREHENSIVE_SETUP(Fruit, LIST_OF_FRUIT)
诀窍是COMPREHENSIVE_SETUP
宏的最后一行。
有了这个,我可以用ColourCount
和FruitCount
常量代替NUM_COLOURS
,并且它们不是枚举的一部分,因此它们不需要出现在开关中。