2012-03-26 8 views
6

Tenía este código:¿Por qué no puedo inicializar una variable estática con un valor no literal?

int foo(void){ 
    return 1; 
} 

int main(void){ 
    static const int x = foo(); 

    //do stuff 
    return 0; 
} 

pero me dio un error sobre la inicialización de una variable estática con un valor no constante. Pensé que tenía algo que ver con el especificador const, pero no fue así. Terminé dejando caer la palabra clave const y hacer esto:

int foo(void){ 
    return 1; 
} 

int main(void){ 
    static int x = 0; 
    if (x == 0) x = foo(); 

    //do stuff 
    return 0; 
} 

Ahora, ¿por qué no puede el compilador simplemente retrasar la inicialización de la variable static int x hasta que se utiliza, y lo más importante, ¿por qué no puede simplemente ponerlo en una sección de lectura y escritura, y simplemente hacer cumplir que no está escrito en tiempo de compilación? Me gustaría usar la palabra clave const Y static para mejorar la semántica en mi código, pero realmente no me importa cómo maneja esto el compilador, solo déjalo funcionar.

¿No entiendo bien el estándar C? ¿O está chupando mi compilador? Es MSVC 9.0.

+1

¿Para qué sirve la variable estática en main good? – tchap

+0

'x' parece una variable local en el contexto de su ejemplo. ¿Por qué quieres que esto sea estático? –

+0

@ValAkkapeddi: a menudo debido al hecho de que no necesita/desea reiniciarlo para cada llamada a esa función. –

Respuesta

8

C lo requiere.

Desde el C estándar:

(C99, 6.7.8p4) "Todas las expresiones en un inicializador para un objeto que tiene una duración de almacenamiento estático deberá ser expresiones o literales de cadena constante".

Tenga en cuenta que el calificador const no significa constante sino más bien de solo lectura. Un objeto const no es una constante en C.

La razón un objeto estático no puede ser inicializado por un valor no constante se relaciona con el hecho de que la inicialización de un objeto estático se realiza "antes de inicio del programa" (C99, 6.2.4p3).

+0

Explica por favor cuál es la diferencia entre un objeto const y una constante en C. ¿Una constante en C es un valor literal? – Spidey

+0

La definición de una expresión constante en C es extremadamente limitada. Se define en C99 en 6.6 Expresiones constantes (versión html en http://port70.net/~nsz/c/c99/n1256.html#6.6) –

+0

@Spidey una constante es básicamente un literal escalar, ver C99, 6.4.4 para la definición. Una constante es una expresión constante. Un objeto 'const' no es una expresión constante ni constante. – ouah

1

El valor para la inicialización debe determinarse en el tiempo de compilación o enlace. C no tiene el concepto de constructores que podrían ejecutarse al inicio del programa.

1

Esta limitación viene de la sección C de la norma 6.7.8/4, por lo que no es sólo su compilador:

Todas las expresiones en un inicializador para un objeto que tiene una duración de almacenamiento estático será expresiones constantes o cuerdas literales.

La razón de esto es que a diferencia estándar C++, C sdoes no requieren entornos de ejecución para proporcionar un punto de entrada para la pre-carrera de inicialización (aunque ciertamente no prohibir ella; El modo y el momento de la inicialización estática (5,1 .2) es no especificado).

Cuestiones relacionadas