`__attribute__((some_attribute))` 和 `[[some_attribute]]` 之间有区别吗?

Gab*_*les 5 c++ attributes c++11

我刚刚第一次遇到用方括号括起来的属性,并且我一直在做一些背景阅读:http ://en.cppreference.com/w/cpp/language/attributes 。

至少对于 gcc 来说,似乎允许使用多种技术:

__attribute__((some_attribute))
Run Code Online (Sandbox Code Playgroud)

[[some_attribute]]
Run Code Online (Sandbox Code Playgroud)

它是否正确?什么时候允许或不允许一种技术,首选或不首选?有什么不同?

看起来[[some_attribute]]只有 C++11 才允许,对吧?

Edg*_*jān 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
Run Code Online (Sandbox Code Playgroud)

所以,[[...]]是一个标准化的语法。

相反,是扩展__attribute__ ((attribute-list))的语法:gcc

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

...

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