猿问

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

int value;


const int signalmin = some_function();


switch(value)

{

   case signalmin:

   break;

}

我读取了some_function的值,并使用该int值进行了切换。C99编译器返回:


错误:案例标签未减少为整数常量


但是我不能使用a,#define因为在执行开关之前要读取int值。


胡说叔叔
浏览 1098回答 3
3回答

慕的地6264312

switch标签必须是常量表达式,必须在编译时对其求值。如果要分支运行时值,则必须使用if。- const限定变量不是常量表达式,它只是一个不允许修改的值。6.6(6)[C99和C2011标准的n1570草案]中详细说明了整数常量表达式的形式:6 整数常量表达式应具有整数类型,并且仅应具有整数常量,枚举常量,字符常量,sizeof 结果为整数常量的_Alignof表达式,表达式和浮点常量(它们是强制转换的立即数)的操作数。整数常量表达式中的强制转换运算符只能将算术类型转换为整数类型,除非作为sizeofor _Alignof运算符的一部分。仅sizeof允许结果为整数常量的表达式的限制排除了sizeof其操作数为可变长度数组的表达式。

肥皂起泡泡

让我举例说明。在设置4.6.3了标志的gcc版本上测试了以下内容-std=c99 -pedantic:#define SOME_HARDCODED_CONSTANT 0 //goodint 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块来做到这一点。

收到一只叮咚

在OSX上,clang似乎将常量用作大小写标签,而不会产生抱怨。#include <stdio.h>#define SOME_HARDCODED_CONSTANT 0 //good for sureint foo(int i, int b){&nbsp;&nbsp; &nbsp; const int c=1; //no problem!!!&nbsp; &nbsp; switch(i){&nbsp; &nbsp; &nbsp; &nbsp; case SOME_HARDCODED_CONSTANT: //all good&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; printf("case SOME_HARDCODED_CONSTANT\n"); break;&nbsp; &nbsp; &nbsp; &nbsp; case c:&nbsp; &nbsp; &nbsp;//no compile error for clang&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; printf("case c\n"); break;&nbsp; &nbsp; &nbsp; &nbsp; case 5: //all good&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; printf("case 5\n"); break;&nbsp; &nbsp; }&nbsp; &nbsp;&nbsp; &nbsp; return i+b;}int main() {&nbsp; &nbsp; printf("test foo(1,3): %d\n", foo(1,3));}输出:$> cc test.c -o test; ./test&nbsp;case ctest foo(1,3): 4
随时随地看视频慕课网APP
我要回答