2009-11-11 11 views
27

Estaba viendo esto SO question y llegué a pensar en const ints versus #defines y me di cuenta de que realmente no entiendo por qué el compilador no puede lidiar con esto. Podría alguien arrojar alguna luz sobre por qué el siguiente código¿Por qué gcc no permite un const int como expresión de caso?

const int FOO = 10; 

int main(int argc, char** argv) 
{ 
    switch(argc) 
    { 
     case FOO: { printf("foo\n"); } 
     default: { printf("default\n"); } 
    } 
} 

resultados en

error: case label does not reduce to an integer constant 

leí la especificación ISO-C99 que establece en 6.8.4.2.3 que

El la expresión de cada etiqueta de caso será una expresión entera constante y no habrá dos expresiones de expresiones constantes en el mismo interruptor declaración tendrá el mismo valor después de la conversión.

Entiendo por qué la expresión de caso debe ser constante, pero no por qué solo un literal hace feliz al compilador (gcc 4.2.1).

+0

Curiosamente, ese código parece compilarse y ejecutarse correctamente en gcc-4.3.4: http://ideone.com/n1bmIb Editar: Ah ... pero solo como C++, no C. – GrahamS

Respuesta

26

Una expresión constante no es lo mismo que un valor de tipo const-qualified, aunque técnicamente el valor es conocido por el compilador en el punto de la instrucción case.

Imagine qué pasaría si otro archivo declara extern const int FOO y trata de usarlo de la misma manera. El compilador no sabría qué era FOO porque estaba definido en otro archivo. Aunque tiene un valor constante , no es una expresión constante.

+2

Ah. Gracias por el ejemplo externo. Súper claro. El ejemplo – nall

+13

'extern' no aclara nada y realmente no explica nada. En el lenguaje C++ también puedes desclasificar una constante 'extern', como en C, pero en C++ es perfectamente legal usar objetos 'const int' en expresiones constantes, incluidas las mayúsculas y minúsculas (no las externas, por supuesto). La única respuesta verdadera a la pregunta original es que se hizo de esa manera históricamente. Desde el principio en C, el término "constante" significaba valores numéricos literales, no objetos 'const'. ¿Por qué? Simplemente porque. – AnT

+1

Bueno, el ejemplo externo fue el que no se me ocurrió que el compilador no pudo manejar. Tu comentario es valioso, sin embargo. Gracias. – nall

Cuestiones relacionadas