我试图将GCC attributes与C++11 syntax一起使用。例如:
warning: ‘used’ attribute ignored [-Wattributes]
static void [[used]] foo(void)
^
但我得到以下内容:
if (( c = getchar() ) != EOF) {
main();
printf("%c", c);
}
为什么忽略该属性?是否可以将GCC属性用作C ++属性?
答案 0 :(得分:4)
C ++ 11中没有[[used]]
属性,这就是它被忽略的原因。的(*)强>
有特定于gcc的__attribute__((used))
,可以应用于静态对象或函数定义。它告诉编译器发出定义,即使该符号似乎完全没用 - 换句话说,它确保这样的符号将出现在结果对象文件中。
(*)需要忽略它,因为标准允许实现定义其他特定于实现的属性。因此将未知属性视为错误毫无意义(类似情况:#pragma
指令)。
其他一些信息:
属性为实现定义的语言扩展提供统一的标准语法,例如GNU和IBM语言扩展
__attribute__((...))
,Microsoft扩展__declspec()
等。
而且,可能是最重要的部分:
C ++标准仅定义了以下属性。所有其他属性都是特定于实现的。
[[noreturn]]
[[carries_dependency]]
[[deprecated]]
(C ++ 14)[[deprecated("reason")]]
(C ++ 14)
答案 1 :(得分:1)
gcc属性与C ++ 11中引入的属性不同。
used
是特定于gcc的属性,应使用gcc属性语法__attribute__((used))
引入。标准C ++中没有[[used]]
属性,因此gcc将忽略它。