将gcc属性与C++11属性语法结合使用

Using gcc attributes with C++11 attributes syntax

本文关键字:结合 属性语法 C++11 gcc 属性      更新时间:2023-10-16

我试图将GCC属性与C++11语法一起使用。例如:

static void [[used]] foo(void)
{
// ...
}

但我得到了以下内容:

warning: ‘used’ attribute ignored [-Wattributes]
static void [[used]] foo(void)
^

为什么该属性被忽略?是否可以将GCC属性用作C++属性?

[[gnu::used]] static void foo(void) {}

首先,属性只能出现在特定的地方,否则你会得到:

x.cc:1:13: warning: attribute ignored [-Wattributes]
static void [[gnu::used]] foo(void) {}
^
x.cc:1:13: note: an attribute that appertains to a type-specifier is ignored

其次,used不是标准的警告,因此它被隐藏在专有的名称空间gnu::中。

C++11中没有[[used]]属性,这就是它被忽略的原因(*)

有特定于gcc的__attribute__((used)),可以应用于静态对象或函数定义。它告诉编译器发出定义,即使该符号似乎根本没有使用——换句话说,它确保这样的符号将出现在结果对象文件中。


(*)需要忽略它,因为标准允许实现定义额外的、特定于实现的属性。因此,将未知属性视为错误是没有意义的(类似的情况:#pragma指令)。


一些附加信息:

属性为实现定义的语言扩展提供统一的标准语法,例如GNU和IBM语言扩展__attribute__((...))、Microsoft扩展__declspec()等。

而且,可能是最重要的部分:

C++标准只定义了以下属性。所有其他属性都是特定于实现的。

  • [[noreturn]]
  • [[carries_dependency]]
  • [[deprecated]](C++14)
  • [[deprecated("reason")]](C++14)

源:属性说明符序列。

gcc属性与C++11中引入的属性不同。

used是gcc特定的属性,应该使用gcc属性语法__attribute__((used))引入。标准C++中没有[[used]]属性,因此gcc将忽略它