2012-08-31 108 views
8

這種使用clang -std=gnu++11 -c test.cpp時編譯:爲什麼在使用clang -std = gnu ++ 11時編譯C++代碼?

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 
} 

任何想法爲什麼?錯誤或一些C++ 11語法或GNU擴展語法?

進出口使用在Xcode 4.4.1(蘋果鐺4.0鐺(標籤/蘋果/鐺 - 421.0.60)(基於LLVM 3.1svn)。

+1

'[[random text here]]這是一個字面描述,你確切地說明了代碼中的內容,還是一個佔位符?我只是想澄清一下。 –

+1

沒有佔位符,確切的源代碼 –

回答

10

這是使用C++ 11的屬性語法。 「random text here」因此假定爲一個屬性。通過C++ 11說明書中,屬性可以修改許多語句和聲明。

屬性可以是陳述的,但它們必須實際上是語句。含義他們最終在一個;就像許多其他的C++語句。

實現支持的一組屬性是實現定義的(Clang不支持任何。的確,它顯然不應該支持屬性語法,according to the website)。沒有被特定實現實現的屬性應該被忽略,這就是爲什麼它沒有效果。

+0

謝謝!我偶然在一行Objective-C++代碼中偶然發現了[[[NSValue alloc]]',因此我偶然發現了這一點:) –

+1

Clang支持C++ 11屬性語法,甚至支持非標準屬性:[鐺::下通電路(http://clang.llvm.org/docs/LanguageExtensions.html#clang__fallthrough)。 Clang實際上也使用了標準屬性。例如,它可以爲標記爲[[[noreturn]]的函數產生實際返回的警告,並且實際上Codegen會受到影響。我想不是所有東西都完整,所以它還沒有標記。 – bames53

+0

@ bames53:這很奇怪,因爲他們的網站只是說「不」。甚至不是部分或某事。 –

相關問題