source

스위치 대/소문자: 오류: 대/소문자 레이블이 정수 상수로 줄어들지 않음

manycodes 2023. 6. 15. 21:58
반응형

스위치 대/소문자: 오류: 대/소문자 레이블이 정수 상수로 줄어들지 않음

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

반응형