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

Tre*_*key 14 c++ gcc pragma clang c++17

C++ 17引入了属性[[maybe_unused]].
我假设这是GCC和Clang的标准化版本: __ attribute __((unused)).

对于我不希望看到警告的未使用的函数,我
应该指定属性 吗?

功能声明?

void maybe_used_function() [[maybe_unused]];
Run Code Online (Sandbox Code Playgroud)

函数定义?

void maybe_used_function() [[maybe_unused]] {
  /* impl */
}
Run Code Online (Sandbox Code Playgroud)

任意一个?都?
标准化和编译器特定属性的效果是否相同?
我找不到任何有关放置行为的明确文档,以及常见的做法.


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

void function();
int main(){}
void function() __attribute__((unused)) {}  
Run Code Online (Sandbox Code Playgroud)

警告:GCC不允许在函数定义的此位置使用'unused'属性[-Wgcc-compat] void function()__ attribute __((unused)){


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

__attribute__((unused)) void __attribute__((unused)) function() {}
Run Code Online (Sandbox Code Playgroud)

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

T.C*_*.C. 22

都不是.在

[[attr1]] void [[attr2]] f [[attr3]] () [[attr4]] {}
Run Code Online (Sandbox Code Playgroud)
  • attr1和相关attr3(或适用)f自己.
  • attr2属于前面的类型,void.
  • attr4属于f类型(" ()返回的功能" void),而不是f.

你想要maybe_unused附属f,所以你可以把它放在位置1或3,但不是2或4.

@ ildjarn的答案涵盖了其余部分.

对于GCC __attribute__,您必须检查其文档.

  • 我们在这里谈论属性.`const`不是属性. (2认同)

ild*_*arn 7

从N4606开始,[dcl.attr.unused]4:

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

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

(由于属性实际上只影响定义,因此允许在两个地方都有意义,但由于该属性可以作为自我文档,因此在声明中也允许使用.)