2011-05-25 14 views
6

El siguiente código costumbre de compilación:de error de compilación C2099: inicializador no es una constante

const int a = 0; 

struct Test 
{ 
    int b; 
}; 

static const struct Test test = 
{ 
    a 
}; 

Es un cortado ejemplo de lo que estoy tratando de hacer, pero lo que estoy haciendo mal?

+0

¿Trataste de compilar esto en un proyecto separado? Me parece perfecto –

Respuesta

11

En la versión C89/90 del lenguaje C, todos los inicializadores agregados deben constar de constantes solamente. En la terminología del lenguaje C una constante del tipo int es un valor literal, como 10, 20u, 0x1 etc. Los miembros Enum también son constantes. Las variables del tipo const int son no constantes en C. No se puede usar una variable const int en el inicializador agregado. (Por esta razón, en lenguaje C, cuando se necesita para declarar una constante llamada se debe utilizar ya sea #define o enum, pero no const calificador.)

En C99 este requisito para inicializadores agregados era relajado. Ahora está bien usar no constantes en los inicializadores agregados de objetos locales. Sin embargo, para objetos estáticos (como en su ejemplo), el requisito aún se cumple. Por lo tanto, incluso en C99 'te tienen que usar ya sea

#define a 0 

o utilizar una constante de enumeración nombrado como se sugiere en @R ..' s respuesta.

+1

+1, más completo que mi respuesta, aunque esté ligeramente apagado en algunos puntos. Es posible que desee utilizar la frase "expresión constante" en lugar de "constantes", ya que la primera tiene una definición oficial en el lenguaje C, y deja en claro que las expresiones complejas pueden satisfacer el requisito siempre que sus componentes constituyentes "suficientemente" constante". –

6

a no es una expresión constante. Es una variable calificada const. Si desea un nombre simbólico que pueda usar en expresiones constantes, necesita una macro de preprocesador (#define a 0) o una enumeración (enum { a = 0 };).

+4

Como nota, esto es diferente en C++, que le permitirá usar 'enter 'las variables enteras calificadas inicializadas con expresiones constantes en otras expresiones constantes. –

+0

observado. ¿También es diferente en Java y C#? ¿Qué hay de Python? ¿O lisp? ;-) –

Cuestiones relacionadas