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() {}
也许其中一种方法是我希望如何在函数定义中使用该属性?
答案 0 :(得分:22)
都不是。 在
[[attr1]] void [[attr2]] f [[attr3]] () [[attr4]] {}
attr1
和attr3
附加(或适用)f
本身。attr2
附属于上述类型void
。attr4
附加到f
的类型(“()
返回void
的功能),而不是f
。您希望maybe_unused
与f
相关联,因此您可以将其放在第1或第3位,但不能放在2或4位。
@ildjarn's answer涵盖其余部分。
对于GCC的__attribute__
,您必须查看其文档。
答案 1 :(得分:6)
来自N4606,[dcl.attr.unused]¶4:
声明没有
maybe_unused
属性的名称或实体以后可以使用该属性重新声明,反之亦然。在标记第一个实体的第一个声明之后,实体被视为标记。
由于函数定义是一个声明([dcl.dcl]¶1),这意味着你可以将它放在任何一个地方并且它的行为相同。
(由于该属性实际上只影响定义,因此在两个地方都允许这样做,但由于该属性可以作为自我文档使用,因此允许在宣言上。)