我应该在函数声明或定义上放置 [[maybe unused]] 吗?

do I put [[maybe unused]] on function declarations or definitions?

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)) {}  

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


但是属性可以放在另外两个地方不会报错:

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

也许这些方法之一是我应该如何在函数定义上使用属性?

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

A name or entity declared without the maybe_unused attribute can later be redeclared with the attribute and vice versa. An entity is considered marked after the first declaration that marks it.

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

(在这两个地方都允许是有意义的,因为该属性实际上只影响 定义,但因为该属性可以作为自我文档,它也是 permitted on the declaration.)[=​​12=]

都没有。 在

[[attr1]] void [[attr2]] f [[attr3]] () [[attr4]] {}
  • attr1attr3 属于(或适用于)f 本身。
  • attr2属于前面的类型,void.
  • attr4 属于 f 的类型(“() 返回 void 的函数”),而不是 f

您希望 maybe_unused 属于 f,因此您可以将其放在位置 1 或 3,而不是 2 或 4。

涵盖其余部分。

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