¿Por qué gcc no permite una constante como una expresión de caso?
objective-c compiler-construction (1)
Una expresión constante no es lo mismo que un valor de tipo cualificado por const, aunque técnicamente el compilador conoce el valor en el punto de la declaración del case
.
Imagine lo que sucedería si otro archivo se 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.
Estaba mirando esta pregunta de SO y me puse a pensar en constantes contra #defines y me di cuenta de que en realidad no entiendo por qué el compilador no puede lidiar con esto. ¿Podría alguien arrojar algo de luz sobre por qué el siguiente código
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
La expresión de cada etiqueta de caso será una expresión de constante entera y no habrá dos de las expresiones de constantes de caso en la misma instrucción de conmutación tendrán 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).