为什么在使用clang -std = gnu ++ 11时编译这个C ++代码?

时间:2012-08-31 09:35:16

标签: c++ c++11 clang

使用clang -std=gnu++11 -c test.cpp时编译:

void test() {
    [[random text here]]
    if (0) {
    }
}

但这会导致错误main.cpp:3:1: error: expected statement

void test() {
    [[random text here]]
}

如果我使用clang -std=gnu++11 -S -emit-llvm main.cpp进行编译并查看LLVM代码,则看起来[[...]]行无效:

define void @_Z5testv() nounwind uwtable ssp {
  ret void
}

任何想法为什么? bug或一些C ++ 11语法或GNU扩展语法?

我正在使用Xcode 4.4.1中的clang(Apple clang 4.0版(标签/ Apple / clang-421.0.60)(基于LLVM 3.1svn)。

1 个答案:

答案 0 :(得分:10)

这是使用C ++ 11的属性语法。因此,“random text here”被假定为属性。根据C ++ 11规范,属性可以修改许多语句和声明。

属性可以是语句,但它们实际上必须是语句。这意味着它们以;结尾,就像许多其他C ++语句一样。

实现支持的属性集是实现定义的(并且Clang不支持任何属性。实际上,它显然不应该支持属性语法,according to the website)。应忽略特定实现未实现的属性,这就是它没有效果的原因。