使用带有C ++ 11属性语法的gcc属性

时间:2015-04-22 19:23:37

标签: c++ c++11 gcc attributes

我试图将GCC attributesC++11 syntax一起使用。例如:

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

但我得到以下内容:

   if (( c = getchar() ) != EOF) {
        main();
        printf("%c", c);
   }

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

2 个答案:

答案 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)
  •   

来源:attribute specifier sequence

答案 1 :(得分:1)

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

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