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