2012-08-31 8 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

'[[ランダムなテキストはここ]]]これはコードに書かれているものを正確に表現したものなのでしょうか、それとも何かのプレースホルダーですか?私はそれを明確にしたい。 –

+1

正確なソースコードであるプレースホルダはありません –

答えて

10

これは、C++ 11の属性構文を使用しています。 「random text here」したがって、属性を想定している。C++ 11の仕様では、属性は多くのステートメントと宣言を変更することができます。

属性は、文することができますが、彼らは実際でなければならない。彼らは終わら意味;他の多くのC++文と同様です。

実装でサポートされている属性セットは実装定義です(Clangはいずれもサポートしていません)。確かに、それは属性構文を全くサポートしていないはずです(according to the website)。特定の実装で実装されていない属性は無視する必要があります。そのため、影響はありません。

+0

ありがとう!私は、ある人が誤って '[[NSValue alloc]]'を単独で行に入力したObjective-C++コードでこれを見つけました:) –

+1

ClangはC++ 11の属性構文をサポートしていて、 clang :: fallthrough](http://clang.llvm.org/docs/LanguageExtensions.html#clang__fallthrough)。 Clangは標準属性を実際に使用しています。例えば、 '[[noreturn]]とマークされた関数が実際に復帰するという警告を出すことができ、codegenは実際に影響を受けます。私はすべてが完了していないので、まだマークされていないと思います。 – bames53

+0

@ bames53:ウェブサイトは単に「いいえ」と言っているので、それは奇妙です。部分的でも何かでさえない。 –

関連する問題