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__,您必须检查其文档.
从N4606开始,[dcl.attr.unused]4:
声明没有该
maybe_unused属性的名称或实体以后可以使用该属性重新声明,反之亦然.在标记第一个实体的第一个声明之后,实体被视为已标记.
由于函数定义是一个声明([dcl.dcl]1),这意味着你可以将它放在任何一个地方并且它的行为相同.
(由于属性实际上只影响定义,因此允许在两个地方都有意义,但由于该属性可以作为自我文档,因此在声明中也允许使用.)