如何在交换机中将一个枚举值标记为不适当的大小写



给定一个枚举,如下所示:

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宏的最后一行。

有了这个,我可以用ColourCountFruitCount常量代替NUM_COLOURS,并且它们不是枚举的一部分,因此它们不需要出现在开关中。

最新更新