我应该在哪里指定[[gnu :: transparent_union]]?

时间:2014-11-20 03:05:20

标签: c++ c++11 clang

Clang支持使用C++11 generalized attribute syntax for vendor-specific attributes。这意味着理论上,我可以使用Clang支持的任何属性,并使用[[attribute]]语法对其进行标记。

但是,我在使用transparent_union属性时遇到问题。我记得C ++允许你将属性放在任何地方,所以我尝试了以下所有内容,但无济于事:

[[gnu::transparent_union]] union x { int foo; };
// error: an attribute list cannot appear here

union [[gnu::transparent_union]] x { int foo; };
// warning: transparent_union attribute can only be applied to a union definition;
// attribute ignored [-Wignored-attributes]

union x [[gnu::transparent_union]] { int foo; };
// error: an attribute list cannot appear here
// warning: transparent_union attribute can only be applied to a union definition;
// attribute ignored [-Wignored-attributes]

union x { int foo; } [[gnu::transparent_union]];
// error: an attribute list cannot appear here
// warning: transparent_union attribute can only be applied to a union definition;
// attribute ignored [-Wignored-attributes]

使用__attribute__语法的正确位置似乎位于联合定义的末尾:

union x { int foo; } __attribute__((transparent_union));
// OK

[[gnu::transparent_union]]与Clang放在一起的地方(如果有的话)在哪里?

1 个答案:

答案 0 :(得分:2)

在C ++ 11标准中,它在语法中显示 attribute-specifier-seq 位于 class-key 之后,这是{{1是的。

class-head:
       class-key attribute-specifier-seqopt class-head-name class-virt-specifieropt base-clauseopt
       class-key attribute-specifier-seqopt base-clauseopt

[..]

class-key:
       class
       struct
       union

这被证实为:

union

似乎是唯一不会引发诊断的语法。所以也许这是一个Clang bug。

请注意,union [[gnu::transparent_union]] x { int foo; }; 似乎是GNU extension__attribute__是C ++的一部分。