반응형
레이블 뒤에 초기화 된 변수가있는 경우 "레이블은 명령문의 일부만 될 수 있고 선언은 명령문이 아닙니다"라는 메시지가 표시되는 이유는 무엇입니까? [복제]
이 질문에 이미 답변이 있습니다.
- Goto Label 8 답변 후 변수 선언
다음과 같은 간단한 코드가 있습니다.
#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;
}
반응형
'code' 카테고리의 다른 글
입력 유형 버튼-레이블 대 값 (0) | 2020.09.12 |
---|---|
JavaScript의 마이크로 초 타이밍 (0) | 2020.09.12 |
LNK2019 오류를 해결하는 방법 : 해결되지 않은 외부 기호-기능? (0) | 2020.09.12 |
PHP를 사용하여 SQL Server에서 문자열을 이스케이프하는 방법은 무엇입니까? (0) | 2020.09.12 |
asp.net-mvc : js 파일의 면도기 '@'기호 (0) | 2020.09.12 |