Is there a difference between `__attribute__((some_attribute))` and `[[some_attribute]]`?

时间:2018-02-01 18:37:22

标签: c++ c++11 attributes

I just came across attributes enclosed in square brackets for the first time, and I've been doing a little background reading: http://en.cppreference.com/w/cpp/language/attributes.

For gcc at least, there seem to be multiple techniques allowed:

__attribute__((some_attribute))

and

[[some_attribute]]

Is this correct? When is one technique allowed or not allowed, preferred or not preferred? What's the difference?

It looks like [[some_attribute]] is allowed as of C++11 only, right?

2 个答案:

答案 0 :(得分:2)

C ++ 11引入了[[foo]]语法。但是许多编译器在此之前都有自己的语法(在某些情况下还支持一些非标准化的属性)。

简而言之:[[foo]]是标准的,并且应该在任何地方使用符合标准的编译器。其他语法是特定于编译器的。

答案 1 :(得分:2)

根据 N4659

  

10.6.1属性语法和语义[dcl.attr.grammar]

     

属性指定各种来源的附加信息   类型,变量,名称,块或转换等构造   单元。

attribute-specifier-seq:
    attribute-specifier-seqopt attribute-specifier

attribute-specifier: 
    [ [ attribute-using-prefixopt attribute-list ] ]
    alignment-specifier

因此,[[...]]是标准化语法。

相反,__attribute__ ((attribute-list))的语法为gcc extension

  

属性说明符的格式为__attribute__ ((attribute-list))。属性列表是一个可能为空的逗号分隔的属性序列,其中每个属性都是以下之一:

     

...

由于属性是在 C ++ 11 中引入的,并且您使用gcc C ++ 11 支持(或更新),因此两种类型的语法可供您使用。