C++ 将gcc属性与C++;11属性语法
我正试着用这个。例如,类似这样的事情:C++ 将gcc属性与C++;11属性语法,c++,c++11,gcc,attributes,C++,C++11,Gcc,Attributes,我正试着用这个。例如,类似这样的事情: static void [[used]] foo(void) { // ... } 但我得到了以下信息: 警告:已忽略“已使用”属性[-Wattributes] 静态无效[[已使用]]foo(无效) ^ 为什么该属性被忽略?是否可以将GCC属性用作C++属性?< /P> < P> GCC属性与C++ 11中引入的属性不相同。 used是一个特定于gcc的属性,应该使用gcc属性语法\uuuuuuuuuuuu属性((used))引入。标准C++中
static void [[used]] foo(void)
{
// ...
}
但我得到了以下信息:
警告:已忽略“已使用”属性[-Wattributes]
静态无效[[已使用]]foo(无效)
^
为什么该属性被忽略?是否可以将GCC属性用作C++属性?< /P> < P> GCC属性与C++ 11中引入的属性不相同。
used
是一个特定于gcc的属性,应该使用gcc属性语法\uuuuuuuuuuuu属性((used))
引入。标准C++中没有<代码> [[Up] ] /Cuth>属性,所以GCC将简单地忽略它。< P>在C++ 11中没有<代码> [[使用] ] /COD>属性,这就是为什么它被忽略了。strong>(*)
有一个特定于gcc的\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。它告诉编译器发出定义,即使那个符号看起来根本并没有使用——换句话说,它确保这样的符号将出现在结果对象文件中
(*)需要忽略它,因为标准允许实现定义附加的、特定于实现的属性。因此,没有必要将未知属性视为错误(类似情况:#pragma
指令)
其他一些信息:
属性为实现定义的语言扩展提供统一的标准语法,例如GNU和IBM语言扩展\uuuuu属性(…)
、Microsoft扩展\uuuu declspec()
,等等
而且,可能是最重要的部分:
只有以下属性由C++标准定义。所有其他属性都是特定于实现的
[[noreturn]]
[[carries_dependency]]
[[弃用]]
(C++14)
[[已弃用(“原因”)]
(C++14)
来源:
首先,该属性只能出现在特定位置,否则会出现:
x.cc:1:13:警告:忽略属性[-Wattributes]
静态void[[gnu::used]]foo(void){}
^
x、 cc:1:13:注意:忽略属于类型说明符的属性
其次,used
不是一个标准的警告,因此它被隐藏在一个专有的名称空间gnu::
没有任何错误。是什么让你相信任何事情都是错的?@KerrekSB“是什么让你相信任何事情都是错的?”这当然是一个警告。为什么会这样?@KerrekSB:事实上,属性是ignored@KerrekSB“我每天都从我妻子那里得到这个消息。”那些唠叨的日常烦恼者…………KerrekSB:我怎么做才能不被忽视呢?C++标准不限制支持属性的数量。它预定义了一些属性(如[[noreturn]]
),但它允许使用实现定义的语义存在其他属性。@KerrekSB,这很有趣。没有类似于(库定义的)用户定义文字的保留字或转换吗?@JohanLundberg:我不这么认为。请参阅我添加的链接。
[[gnu::used]] static void foo(void) {}