within switch statement not loop jump fpermissive error dev con casos caracteres c

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 operador sizeof 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.