查看[[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)
^
这是否是使用此属性的有效用例,是否有其他用例在此位置添加属性或者这只是一个无用的添加?
答案 0 :(得分:5)
此属性的目的是声明实体可能永远不会被使用,如果是这样的话,实现不应该在某处警告你例如,您可能使用错误的实体。
switch
语句是一个完全不同的问题:即使枚举器从未在该TU中使用,处理枚举器也是有问题的;它表示程序中存在逻辑差距。如果该函数具有外部链接,并且其他人使用该枚举器调用它,该怎么办?
简而言之,即使在我们将枚举器标记为可能未使用的TU中(感觉毫无意义,因为它们通常在命名空间范围内),在程序逻辑中覆盖它仍然是非常明智的(并且Clang非常正确)在给你这个建议。)
答案 1 :(得分:0)
记录了Clang的一个错误并将其标记为已解决:https://bugs.llvm.org/show_bug.cgi?id=36231
这似乎可以确认枚举值允许在没有警告的情况下在开关中丢失,以防被标记为[[maybe_unused]]