스위치 대/소문자: 오류: 대/소문자 레이블이 정수 상수로 줄어들지 않음
int value;
const int signalmin = some_function();
switch(value)
{
case signalmin:
break;
}
some_function의 값을 읽고 그 int 값을 사용하여 스위치 케이스를 켭니다.C99 컴파일러는 다음을 제공합니다.
오류: 대/소문자 레이블이 정수 상수로 줄어들지 않습니다.
하지만 나는 사용할 수 없습니다.#define
스위치가 실행되기 전에 int 값을 읽고 있기 때문입니다.
switch
레이블은 상수 식이어야 하며 컴파일 시 평가되어야 합니다.런타임 값을 분기하려면 다음을 사용해야 합니다.if
.
A const
-qualified variable은 상수 식이 아니며 수정할 수 없는 값일 뿐입니다.
정수 상수 식의 형태는 6.6 (6) [C99 및 C2011 표준의 n1570 초안]에 자세히 나와 있습니다.
6 정수 상수 표현식은 정수형이어야 하며 정수 상수, 열거 상수, 문자 상수인 피연산자만 있어야 합니다.
sizeof
결과가 정수 상수인 식_Alignof
표현식 및 주조물의 직접 피연산자인 부동 상수.정수 상수 식의 캐스트 연산자는 연산자의 일부를 제외하고 산술 형식을 정수 형식으로만 변환해야 합니다.sizeof
또는_Alignof
교환입니다.
라는 제한은 오직sizeof
결과가 정수 상수인 식은 규칙 제외가 허용됩니다.sizeof
피연산자가 가변 길이 배열인 식입니다.
예를 들어 보겠습니다.다음은 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
런타임에 인수를 평가할 수 없습니다.an을 사용if-else
그것을 하기 위해 차단합니다.
C. 모두에서case
레이블은 컴파일 시간 상수여야 합니다.C에서,const
한정자는 컴파일 시간 상수를 만들지 않고 런타임 변수가 읽기 전용임을 지정합니다.
A switch
사용자가 하려는 작업에 적합한 제어 구조가 아닙니다.
저는 아래 코드를 사용하고 있으며, 잘 작동하고 있습니다.
다음을 사용하여 오류가 발생합니다.case "+":
예를 들어, 이중 기호를 사용하여, 글을 써보세요.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;
}
C에서는 변수를 스위치 대소문자 레이블에 사용하지 않고 상수 식만 사용할 수 있습니다.
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
언급URL : https://stackoverflow.com/questions/14069737/switch-case-error-case-label-does-not-reduce-to-an-integer-constant
'source' 카테고리의 다른 글
Oracle의 열에 시퀀스가 있는지 확인합니다. (0) | 2023.06.15 |
---|---|
Google Firestore - 여러 ID로 여러 문서를 한 번의 왕복으로 가져오는 방법 (0) | 2023.06.15 |
ORA-01658: 테이블스페이스 TS_DATA에서 세그먼트에 대한 INITIAL 익스텐트를 생성할 수 없습니다. (0) | 2023.06.15 |
요인 수준과 요인 레이블 간의 혼동 (0) | 2023.06.15 |
0이 아닌 비트를 양의 정수로 빠르게 카운트하는 방법 (0) | 2023.06.15 |