code

레이블 뒤에 초기화 된 변수가있는 경우 "레이블은 명령문의 일부만 될 수 있고 선언은 명령문이 아닙니다"라는 메시지가 표시되는 이유는 무엇입니까?

codestyles 2020. 9. 12. 10:03
반응형

레이블 뒤에 초기화 된 변수가있는 경우 "레이블은 명령문의 일부만 될 수 있고 선언은 명령문이 아닙니다"라는 메시지가 표시되는 이유는 무엇입니까? [복제]


이 질문에 이미 답변이 있습니다.

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

#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 -ㅏ

반응형