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放在一起的地方(如果有的话)在哪里?
答案 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 ++的一部分。