2012-08-31 19 views
8

Questo compila quando si utilizza clang -std=gnu++11 -c test.cpp:Perché questo codice C++ viene compilato quando si utilizza clang -std = gnu ++ 11?

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

Ma questo dà l'errore main.cpp:3:1: error: expected statement:

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

Se compilo con clang -std=gnu++11 -S -emit-llvm main.cpp e guardare il codice LLVM sembra che la linea [[...]] non ha effetto:

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

Qualche idea, perché? errore o sintassi C++ 11 o sintassi dell'estensione GNU?

Im usando clangore da Xcode 4.4.1 (Apple clang versione 4.0 (tag/Apple/clang-421.0.60) (sulla base di LLVM 3.1svn).

+1

'[[testo casuale qui]]' È una descrizione letterale di esattamente ciò che hai inserito nel codice, o è un segnaposto per qualcosa? Voglio solo chiarirlo. –

+1

nessun segnaposto che è il codice sorgente esatto –

risposta

10

questo sta usando la sintassi attributo C++ 11 di. "random text here" è quindi stimato essere un attributo. Con la specifica C++ 11, un attributo può modificare molte dichiarazioni e dichiarazioni.

attributi possono essere dichiarazioni, ma devono essere effettivamente dichiarazioni. Senso finiscono in un ; come molte altre istruzioni C++

Il set di attributi supportati da un'implementazione è definito dall'implementazione (e Clang non ne supporta nessuno. In effetti, apparentemente non si suppone che supporti la sintassi degli attributi, according to the website). Gli attributi non implementati da una particolare implementazione dovrebbero essere ignorati, motivo per cui non ha alcun effetto.

+0

Grazie! Mi sono imbattuto in questo in qualche codice Objective-C++ in cui qualcuno aveva accidentalmente digitato '[[NSValue alloc]]' da solo su una riga :) –

+1

Clang supporta la sintassi degli attributi C++ 11, e supporta anche un attributo non standard: [ clang :: falltrough] (http://clang.llvm.org/docs/LanguageExtensions.html#clang__fallthrough). Clang effettivamente usa anche gli attributi standard. Ad esempio, può produrre un avvertimento per una funzione contrassegnata con '[[noreturn]]' che effettivamente ritorna, e codegen è effettivamente influenzato. Immagino che non tutto sia completo, quindi non è ancora segnato. – bames53

+0

@ bames53: È strano, dal momento che il loro sito web dice semplicemente "no". Neanche parziale o qualcosa del genere. –

Problemi correlati