将[[可能未使用]]放在函数声明或定义上?

时间:2016-07-21 20:30:38

标签: c++ gcc clang pragma c++17

C ++ 17引入了属性[[maybe_unused]] 我认为这是GCC和Clang的标准化版本:__attribute__((unused))

对于我不想看到警告的未使用功能,
我应该在

上指定属性吗?

函数声明?

void maybe_used_function() [[maybe_unused]];

函数定义?

void maybe_used_function() [[maybe_unused]] {
  /* impl */
}

哪一个?两者兼而有之?
标准化和编译器特定属性的效果是否相同?
我无法找到有关展示位置行为的明确文档,以及常见的做法。

当我将属性放在定义中的函数体之前时,GCC和clang会出错:

void function();
int main(){}
void function() __attribute__((unused)) {}  

警告:海湾合作委员会不允许'未使用'属性在这个位置       在函数定义[-Wgcc-compat] void function()__ attribute __((unused)){

但是,该属性可以放在其他两个地方而不会出错:

__attribute__((unused)) void __attribute__((unused)) function() {}

也许其中一种方法是我希望如何在函数定义中使用该属性?

2 个答案:

答案 0 :(得分:22)

都不是。 在

[[attr1]] void [[attr2]] f [[attr3]] () [[attr4]] {}
  • attr1attr3附加(或适用)f本身。
  • attr2附属于上述类型void
  • attr4附加到f的类型(“()返回void的功能),而不是f

您希望maybe_unusedf相关联,因此您可以将其放在第1或第3位,但不能放在2或4位。

@ildjarn's answer涵盖其余部分。

对于GCC的__attribute__,您必须查看其文档。

答案 1 :(得分:6)

来自N4606,[dcl.attr.unused]¶4:

  

声明没有maybe_unused属性的名称或实体以后可以使用该属性重新声明,反之亦然。在标记第一个实体的第一个声明之后,实体被视为标记。

由于函数定义是一个声明([dcl.dcl]¶1),这意味着你可以将它放在任何一个地方并且它的行为相同。

(由于该属性实际上只影响定义,因此在两个地方都允许这样做,但由于该属性可以作为自我文档使用,因此允许在宣言上。)