开关情况:错误:case标签未减少为整数常量

yvgpqqbh  于 2023-04-29  发布在  其他
关注(0)|答案(6)|浏览(239)
int value;

const int signalmin = some_function();

switch(value)
{
   case signalmin:
   break;
}

我读取some_function的值,并使用该int值来执行switch case。C99编译器返回:
错误:case标签未减少为整数常量
但是我不能使用#define,因为int值在开关执行之前被读取。

li9yvcax

li9yvcax1#

switch标签必须是常量表达式,它们必须在编译时计算。如果您希望在运行时值上分支,则必须使用if
一个const限定的变量不是一个 * 常量表达式 *,它只是一个不允许修改的值。
整数常量表达式的形式在6中详细介绍。6(6)[C99和C2011标准的n1570草案]:
6一个 integer constant expression 必须是integer类型,并且只能有整型常量、枚举常量、字符常量、结果是整型常量的sizeof表达式、_Alignof表达式和作为转换的直接操作数的浮点常量。整数常量表达式中的强制转换运算符只能将算术类型转换为整数类型,除非作为sizeof_Alignof运算符的操作数的一部分。
仅允许结果为整数常量的sizeof表达式的限制排除了操作数为可变长度数组的sizeof表达式。

khbbv19g

khbbv19g2#

让我插进来举个例子。以下代码在gcc版本4.6.3上进行了测试,并设置了-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
    }
}

正如其他人所指出的,case参数不能在运行时计算。使用一个if-else块来实现这一点。

dxxyhpgq

dxxyhpgq3#

在C中,所有case标签必须是 * 编译时 * 常量。在C语言中,const限定符并不创建编译时常量,它只是指定运行时变量是只读的。
switch不是您尝试执行的适当控制结构。

deyfvvtc

deyfvvtc4#

我正在使用下面的代码,它运行良好。

使用case "+": i时出现错误。例如,使用双引号,所以尝试使用单引号编写case '+':

#include <stdio.h>

int main() {
    char x;
    int a = 20, b = 10;
    scanf("%c", &x);
    switch (x) {
        case '+':
            printf("%d", a + b);
            break;
        case '-':
            printf("%d", a - b);
            break;
        case '*':
            printf("%d", a * b);
            break;
        case '/':
            printf("%d", a / b);
            break;
        default:
            printf("sorry");
    }
    return 0;
}
yhxst69z

yhxst69z5#

在C语言中,变量不能用在开关大小写标签中,而只有常量表达式才允许用。

xbp102n0

xbp102n06#

在OSX上,clang似乎毫无怨言地将常量作为大小写标签。

#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));
}

输出:

$> cc test.c -o test; ./test 
case c
test foo(1,3): 4

相关问题