[[maybe_unused]] 在枚举器上

[[maybe_unused]] on enumerator

本文关键字:枚举 unused maybe      更新时间:2023-10-16

查看[[maybe_unused]]的规范,它指出:

显示在类、typedef、变量、非静态数据成员、函数、枚举或枚举器的声明中。如果编译器对未使用的实体发出警告,则会禁止对声明maybe_unused的任何实体发出警告。

由于这提到了枚举器,我有点希望它有一个用例。由于我唯一能想到的就是-Wswitch警告,我尝试了Clang,GCC和MSVC。

enum A
{
    B,
    C [[maybe_unused]]
};
void f(A a)
{
    switch (a)
    {
        case B: break;
    }
}

所有 3 个编译器都给了我以下警告的变体:

<source>:9:13: warning: enumeration value 'C' not handled in switch [-Wswitch]
    switch (a)
            ^

实时代码

这是使用此属性的有效用例,是否有其他用例在此位置添加属性,或者这只是无用的添加?

此属性的目的是声明实体可能永远不会被使用,如果是这种情况,实现不应该打扰警告你,例如,你可能在某个地方使用了错误的实体。

switch语句是完全不同的事情:即使枚举器从未在该 TU 中使用过枚举器,不处理枚举器也是有问题的;它表明程序中存在逻辑差距。如果该函数具有外部链接,并且其他人使用该枚举器调用它,该怎么办?

简而言之,即使在我们将枚举器标记为可能未使用的 TU 中(这感觉毫无意义,因为在命名空间范围内它们通常是(,在您的程序逻辑中覆盖它仍然是非常明智的(Clang 给你这个建议是非常正确的(。

为 Clang 记录了一个错误并标记为已解决:https://bugs.llvm.org/show_bug.cgi?id=36231

这似乎证实了允许在交换机中丢失枚举值而不发出警告,以防它被标记为 [[maybe_unused]]