programing

라벨 뒤에 초기화되는 변수가 있는 경우 "라벨은 스테이트먼트의 일부만 될 수 있고 선언은 스테이트먼트가 아닙니다"라고 표시되는 이유는 무엇입니까?

prostudy 2022. 5. 28. 09:05
반응형

라벨 뒤에 초기화되는 변수가 있는 경우 "라벨은 스테이트먼트의 일부만 될 수 있고 선언은 스테이트먼트가 아닙니다"라고 표시되는 이유는 무엇입니까?

다음과 같은 간단한 코드가 있습니다.

#include <stdio.h>
int main () 
{
    printf("Hello ");
    goto Cleanup;
Cleanup:
    char *str = "World\n";
    printf("%s\n", str);
}

라벨 뒤에 새 변수가 선언되었기 때문에 오류가 발생합니다.{} 블록에서 레이블 뒤에 내용(주로 초기화)을 넣으면 컴파일이 성공합니다.

스위치일 경우 블록의 이유는 알 수 있다고 생각합니다만, 라벨일 경우 해당이 되는 이유는 무엇입니까?

이 오류는 gcc 컴파일러에서 발생했습니다.

언어 기준으로는 도저히 허락할 수 없습니다.라벨 뒤에 이어지는 것은 문뿐이며 선언은 C에서 문으로 계산되지 않습니다.이를 회피하는 가장 쉬운 방법은 라벨 뒤에 빈 문을 삽입하는 것입니다.이것에 의해, 블록내에서 필요한 방법으로 스코프를 추적할 필요가 없어집니다.

#include <stdio.h>
int main () 
{
    printf("Hello ");
    goto Cleanup;
Cleanup: ; //This is an empty statement.
    char *str = "World\n";
    printf("%s\n", str);
}

이것은 C 문법의 기발함이다.라벨(Cleanup:선언 직전에는 를 표시할 수 없습니다(예:char *str ...;스테이트먼트 전만 ( )printf(...);C89에서는 선언이 블록의 선두에만 표시되므로 라벨을 약간 아래로 이동시켜 이 문제를 회피할 수 있기 때문에 큰 어려움은 없었습니다.C99에서는 선언과 코드를 혼재시킬 수 있지만 선언 직전에 라벨을 붙일 수는 없습니다.

라벨의 콜론 바로 뒤에 세미콜론을 붙이면 (Renan이 제안한 대로) 빈 스테이트먼트가 됩니다.머신 생성 코드에서는 이렇게 합니다.또는 선언을 기능 상단에 올립니다.

int main (void) 
{
    char *str;
    printf("Hello ");
    goto Cleanup;
Cleanup:
    str = "World\n";
    printf("%s\n", str);
    return 0;
}

언급URL : https://stackoverflow.com/questions/18496282/why-do-i-get-a-label-can-only-be-part-of-a-statement-and-a-declaration-is-not-a

반응형