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?
答案 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 支持(或更新),因此两种类型的语法可供您使用。