为了账号安全,请及时绑定邮箱和手机立即绑定

切换大小写:错误:大小写标签不减少为整数常量

切换大小写:错误:大小写标签不减少为整数常量

C
胡说叔叔 2019-12-04 14:42:18
int value;const int signalmin = some_function();switch(value){   case signalmin:   break;}我读取了some_function的值,并使用该int值进行了切换。C99编译器返回:错误:案例标签未减少为整数常量但是我不能使用a,#define因为在执行开关之前要读取int值。
查看完整描述

3 回答

?
慕的地6264312

TA贡献1817条经验 获得超6个赞

switch标签必须是常量表达式,必须在编译时对其求值。如果要分支运行时值,则必须使用if。


- const限定变量不是常量表达式,它只是一个不允许修改的值。


6.6(6)[C99和C2011标准的n1570草案]中详细说明了整数常量表达式的形式:


6 整数常量表达式应具有整数类型,并且仅应具有整数常量,枚举常量,字符常量,sizeof 结果为整数常量的_Alignof表达式,表达式和浮点常量(它们是强制转换的立即数)的操作数。整数常量表达式中的强制转换运算符只能将算术类型转换为整数类型,除非作为sizeofor _Alignof运算符的一部分。


仅sizeof允许结果为整数常量的表达式的限制排除了sizeof其操作数为可变长度数组的表达式。


查看完整回答
反对 回复 2019-12-04
?
肥皂起泡泡

TA贡献1829条经验 获得超6个赞

让我举例说明。在设置4.6.3了标志的gcc版本上测试了以下内容-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块来做到这一点。


查看完整回答
反对 回复 2019-12-04
?
收到一只叮咚

TA贡献1821条经验 获得超4个赞

在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


查看完整回答
反对 回复 2019-12-04
  • 3 回答
  • 0 关注
  • 1096 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信