3 回答

TA貢獻(xiàn)1817條經(jīng)驗 獲得超6個贊
switch標(biāo)簽必須是常量表達(dá)式,必須在編譯時對其求值。如果要分支運行時值,則必須使用if。
- const限定變量不是常量表達(dá)式,它只是一個不允許修改的值。
6.6(6)[C99和C2011標(biāo)準(zhǔn)的n1570草案]中詳細(xì)說明了整數(shù)常量表達(dá)式的形式:
6 整數(shù)常量表達(dá)式應(yīng)具有整數(shù)類型,并且僅應(yīng)具有整數(shù)常量,枚舉常量,字符常量,sizeof 結(jié)果為整數(shù)常量的_Alignof表達(dá)式,表達(dá)式和浮點常量(它們是強(qiáng)制轉(zhuǎn)換的立即數(shù))的操作數(shù)。整數(shù)常量表達(dá)式中的強(qiáng)制轉(zhuǎn)換運算符只能將算術(shù)類型轉(zhuǎn)換為整數(shù)類型,除非作為sizeofor _Alignof運算符的一部分。
僅sizeof允許結(jié)果為整數(shù)常量的表達(dá)式的限制排除了sizeof其操作數(shù)為可變長度數(shù)組的表達(dá)式。

TA貢獻(xiàn)1829條經(jīng)驗 獲得超6個贊
讓我舉例說明。在設(shè)置4.6.3了標(biāo)志的gcc版本上測試了以下內(nèi)容-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無法在運行時評估參數(shù)。使用一個if-else塊來做到這一點。

TA貢獻(xiàn)1821條經(jīng)驗 獲得超5個贊
在OSX上,clang似乎將常量用作大小寫標(biāo)簽,而不會產(chǎn)生抱怨。
#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
- 3 回答
- 0 關(guān)注
- 1147 瀏覽
添加回答
舉報