2012-05-16 9 views
6

Hoy probé clang en un proyecto que he desarrollado hace algún tiempo. Me sorprendió cuando se encontró con un error de compilación, ya que había compilado mi proyecto con éxito usando g ++.Paréntesis desequilibrado con __attribute__ en g ++

Este breve fragmento reproduce la línea donde se encuentra el error:

int main() { 
    __attribute__((aligned(16)) char arr[5]; 
} 

que produce este error:

test.cpp:2:32: error: expected ')' 
    __attribute__((aligned(16)) char arr[5]; 
          ^
           ) 

Como se puede ver, no es un paréntesis umbalanced. Hay tres '(', y dos ')'. Esto claramente parece que en realidad debería producir un error de compilación.

¿Es este un uso válido de esta palabra clave? Parece que no puedo encontrar nada en the documentation que indique que sí.

Estoy usando g ++ 4.5.2 y clang 2.8.

Tenga en cuenta que este error se detecta al usar gcc en lugar de g ++.

+0

La [documentación de gcc] (http://gcc.gnu.org/onlinedocs/gcc/Variable-Attributes.html) establece * "La palabra clave' __attribute__' le permite especificar atributos especiales de variables o campos de estructura. * * Esta palabra clave es seguida por una especificación de atributo dentro de doble paréntesis "***. Por lo tanto, no lo dice en palabras explícitas precisas sobre el cierre con el mismo número de paréntesis, pero todos los ejemplos de gcc muestran paréntesis coincidentes, por lo que parece un error. –

+0

Sí, parece que en realidad es un error. No puedo encontrar nada que pueda indicar lo contrario. – mfontanini

+0

@ DavidRodríguez-dribeas clang lo admite. Quiero decir, realmente parece que g ++ no está analizando esa expresión correctamente. clang está haciendo lo correcto (al menos sospecho que sí ... por eso estoy preguntando: D) al informar un error aquí. – mfontanini

Respuesta

3

Esto sería un error del compilador. El compilador ve __attribute__ seguido de dos paréntesis de apertura, algunos otros tokens y luego dos paréntesis de cierre, que es probablemente la definición “ ” del aspecto que debería tener un __attribute__, p. Ej.

<attribute> ::= __attribute__ '((' something '))'

Mi suposición es que las fichas en el medio están siendo interpretados como aligned(16 y por un milagro que todavía funciona.

+0

Perfecto. Acabo de informar esto como un error en bugzilla de gcc. – mfontanini

+0

Sí, probablemente tiene para hacer con 'aligned()' más que con '__attribute__', ya que' __attribute __ ((packed) 'no se compila. – mfontanini

+2

Puede que no sea un error, en mi opinión es porque los paréntesis desequilibrados casi nunca son lo que quieres, pero si GCC permite que cualquier tipo de tokens aparezca dentro de '((' y '))' entonces no se puede considerar un error. Pruebe '__attribute __ ((((((())' y vea si eso se queja de un error. atributo desconocido en lugar de paréntesis desequilibrados. – dreamlax

Cuestiones relacionadas