c++ - 如何在开关中将一个枚举值标记为不适当的大小写

标签 c++ enums compiler-warnings

给定一个枚举:

enum Colours { RED, YELLOW, BLUE, NUM_COLOURS };

还有一些逻辑,例如:

switch (colour) {
case RED: /* ... */ break;
case YELLOW: /* ... */ break;
case BLUE: /* ... */ break;
}

大多数具有合理设置的编译器都会抗议 NUM_COLOURS 是未处理的情况。但是,这显然不是该特定值的用途,并且针对它的 case 语句是无稽之谈。

有没有什么方法可以让 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 中补丁的大小,我不希望在其他工具中支持它需要付出太多努力。

关于c++ - 如何在开关中将一个枚举值标记为不适当的大小写,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57088316/

相关文章:

c++ - 在程序本身捕获openCV程序的内存使用

c++ - 适当的止回控制功能

cocoa - 警告 : comparison is always true due to limited range of data type causes crash

c++ - 派生构造函数警告 : will never be executed

c++ - 如何使用枚举值通过预处理器指令直接编译

c++ - 使用 datastax c++ 驱动程序将大型二进制文件或数组(超过 64MB)插入 Cassandra

python - 自定义 __repr__ 作为从 Enum 派生的类的类方法

ios - typedef 行 : 上的“预期标识符”错误

typescript 接口(interface): specify full specific enum as parameter

c# - 如果有人使用外部类库中的某些类,我如何报告编译错误