라벨 뒤에 초기화되는 변수가 있는 경우 "라벨은 스테이트먼트의 일부만 될 수 있고 선언은 스테이트먼트가 아닙니다"라고 표시되는 이유는 무엇입니까?
다음과 같은 간단한 코드가 있습니다.
#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
'programing' 카테고리의 다른 글
vuex 게시 요청에서 상태의 값을 전달하는 방법 (0) | 2022.05.28 |
---|---|
mockito를 사용하여 개체 속성 값 확인 (0) | 2022.05.28 |
Clion 디버거에서 int 배열의 전체 내용을 표시하려면 어떻게 해야 합니까? (0) | 2022.05.28 |
Apollo Client를 사용하여 상태 업데이트 (0) | 2022.05.28 |
기본값을 옵션 선택 메뉴로 설정 (0) | 2022.05.28 |