switch - caja del interruptor: error: la etiqueta del caso no se reduce a una constante entera
switch case (5)
Déjame participar con un ejemplo. Lo siguiente se probó en la versión 4.6.3
gcc con el conjunto flags -std=c99 -pedantic
:
#define SOME_HARDCODED_CONSTANT 0 //good
int foo(int i, int b){
const int c=0; //bad
int a=0; //bad
switch(i){
case c: //compile error
case a: //compile error.
case (b+a): //compile error
case SOME_HARDCODED_CONSTANT: //all good
case 5: //all good
}
}
Como otros han notado, los argumentos del case
no se pueden evaluar en tiempo de ejecución. Usa un bloque if-else
para hacer eso.
int value;
const int signalmin = some_function();
switch(value)
{
case signalmin:
break;
}
Leí el valor de alguna función y uso ese valor int para activar una caja de conmutadores. El compilador C99 devuelve:
error: la etiqueta del caso no se reduce a una constante entera
Pero no puedo usar un #define porque el valor int se lee antes de que se ejecute el interruptor.
En C, las variables no se deben utilizar en las etiquetas de la caja del interruptor, en cambio las expresiones constantes solo se permiten allí.
En C., todas las etiquetas de los case
deben ser constantes de tiempo de compilación . En C, el calificador const
no crea una constante de tiempo de compilación, simplemente designa que una variable de tiempo de ejecución es de solo lectura.
Un switch
no es la estructura de control adecuada para lo que estás tratando de hacer.
En OSX, clang parece tomar constantes como etiquetas de caso sin quejas.
#include <stdio.h>
#define SOME_HARDCODED_CONSTANT 0 //good for sure
int foo(int i, int b){
const int c=1; //no problem!!!
switch(i){
case SOME_HARDCODED_CONSTANT: //all good
printf("case SOME_HARDCODED_CONSTANT/n"); break;
case c: //no compile error for clang
printf("case c/n"); break;
case 5: //all good
printf("case 5/n"); break;
}
return i+b;
}
int main() {
printf("test foo(1,3): %d/n", foo(1,3));
}
Salida:
$> cc test.c -o test; ./test
case c
test foo(1,3): 4
switch
etiquetas de switch
deben ser expresiones constantes, deben evaluarse en tiempo de compilación. Si desea ramificar en valores de tiempo de ejecución, debe usar un if
.
Una variable const
qualificado no es una expresión constante , es simplemente un valor que no puede modificar.
La forma de las expresiones constantes enteras se detalla en 6.6 (6) [C99 y el borrador n1570 del estándar C2011]:
6 Una expresión constante entera tendrá un tipo entero y solo tendrá operandos que son constantes enteras, constantes de enumeración, constantes de caracteres,
sizeof
expresiones cuyos resultados son constantes enteras,_Alignof
expresiones y constantes flotantes que son los operandos inmediatos de los moldes. Los operadores de transmisión en una expresión constante de entero solo convertirán tipos aritméticos a tipos enteros, excepto como parte de un operando al operadorsizeof
o_Alignof
.
La restricción de que solo el sizeof
expresiones cuyo resultado es una constante entera permite descartar el sizeof
expresiones cuyo operando es una matriz de longitud variable.