2012-08-31 11 views
8

Dies kompiliert, wenn clang -std=gnu++11 -c test.cpp mit:Warum kompiliert dieser C++ - Code mit clng -std = gnu ++ 11?

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

Aber das gibt Fehler main.cpp:3:1: error: expected statement:

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

Wenn ich mit clang -std=gnu++11 -S -emit-llvm main.cpp und Blick auf den Code LLVM kompilieren es wie die [[...]] Zeile sieht keine Wirkung:

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

Irgendwelche Ideen warum? Fehler oder eine C++ 11 Syntax oder GNU Extension Syntax?

Im mit Klirren von Xcode 4.4.1 (Apple-Klirren Version 4.0 (Tags/Apple/Klirren-421.0.60) (basierend auf LLVM 3.1svn).

+1

'[[zufälliger Text hier]]' Ist das eine wörtliche Beschreibung von genau, was Sie in den Code eingeben, oder ist das ein Platzhalter für etwas? Ich möchte das nur klarstellen. –

+1

kein Platzhalter, der der genaue Quellcode ist –

Antwort

10

Dies wird unter Verwendung von C++ 11 Attributsyntax. „random text here“ wird daher angenommen, ein Attribut sein. Durch die C++ 11-Spezifikation, ein Attribut viele Erklärungen und ändern können.

Attribute Aussagen sein können, aber sie haben tatsächlich Aussagen sein. das heißt, sie enden in einem ; genau wie viele andere C++ Anweisungen

Die Menge der von einer Implementierung unterstützten Attribute ist implementierungsdefiniert (und Clang unterstützt keine. Tatsächlich sollte es anscheinend überhaupt keine Attributsyntax unterstützen, according to the website). Attribute, die nicht von einer bestimmten Implementierung implementiert werden, sollten ignoriert werden, weshalb sie keine Auswirkungen haben.

+0

Danke! Ich stolperte darüber in irgendeinem Objective-C++ - Code, wo jemand versehentlich '[[NSValue alloc]]' '' '' '' '' ' –

+1

Clang unterstützt die C++ 11-Attributsyntax und unterstützt sogar ein Nicht-Standard-Attribut: [ clang :: durchfall] (http://clang.llvm.org/docs/LanguageExtensions.html#clang__fallthrough). Clang nutzt tatsächlich auch einige Standardattribute. Zum Beispiel kann es eine Warnung für eine mit '[[noreturn]]' markierte Funktion erzeugen, die tatsächlich zurückkehrt, und Codegen ist tatsächlich betroffen. Ich stelle mir vor, dass nicht alles vollständig ist, also ist es noch nicht markiert. – bames53

+0

@ bames53: Das ist seltsam, da ihre Website einfach "nein" sagt. Nicht einmal ein Teil oder etwas. –

Verwandte Themen