2012-08-31 14 views
8

Esto compila utilizando clang -std=gnu++11 -c test.cpp:¿Por qué este código C++ se compila cuando se usa clang -std = gnu ++ 11?

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

Pero esto da error main.cpp:3:1: error: expected statement:

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

Si compilo con clang -std=gnu++11 -S -emit-llvm main.cpp y mirar el código LLVM parece que la línea [[...]] no tiene ningún efecto:

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

¿Alguna idea de por qué? error o alguna sintaxis C++ 11 o sintaxis de extensión GNU?

Im usando sonido metálico de Xcode 4.4.1 (Apple sonido metálico versión 4.0 (etiquetas/de Apple/ruido metálico-421.0.60) (basado en LLVM 3.1svn).

+1

'[[texto al azar aquí]]' ¿Es esa una descripción literal de exactamente lo que pone en el código, o es un marcador de posición para algo? Solo quiero aclarar eso. –

+1

sin marcador de posición que es el código fuente exacto –

Respuesta

10

Se trata de utilizar la sintaxis de atributo de C++ 11. "random text here" Por consiguiente, se supone que es un atributo. Por la especificación C++ 11, un atributo puede modificar muchas declaraciones y declaraciones.

los atributos pueden ser declaraciones, pero tienen que ser en realidad declaraciones. Significado terminan en un ; al igual que muchas otras declaraciones C++.

El conjunto de atributos soportados por una implementación está definido por la implementación (y Clang no admite ninguno. De hecho, aparentemente no se supone que admita la sintaxis de atributo en absoluto, according to the website). Los atributos no implementados por una implementación en particular deben ser ignorados, por lo que no tiene ningún efecto.

+0

¡Gracias! Me encontré con esto en un código de Objective-C++ en el que alguien había escrito accidentalmente '[[NSValue alloc]]' solo en una línea :) –

+1

Clang no admite la sintaxis del atributo C++ 11, e incluso admite un atributo no estándar: [ clang :: fallthrough] (http://clang.llvm.org/docs/LanguageExtensions.html#clang__fallthrough). Clang realmente hace un cierto uso de los atributos estándar también. Por ejemplo, puede producir una advertencia para una función marcada como '[[noreturn]]' que realmente regresa, y codegen se ve realmente afectado. Me imagino que no todo está completo, así que aún no está marcado. – bames53

+0

@ bames53: Es extraño, ya que su sitio web simplemente dice "no". Ni siquiera un parcial o algo así. –

Cuestiones relacionadas