이 코드를 고려하십시오.
void foo()
{
goto bar;
int x = 0;
bar: ;
}
GCC와 Clang 은 변수 초기화 를 건너 뛰기 때문에 이를 거부합니다bar:
. MSVC는 (사용 제외하고는 전혀 불평하지 않습니다 x
후 bar:
원인 경고).
우리는 비슷한 일을 할 수 있습니다 switch
:
void foo()
{
switch (0)
{
int x = 0;
case 0: ;
}
}
이제 세 컴파일러 모두 오류가 발생합니다 .
스 니펫이 잘못 구성되어 있습니까? 아니면 UB를 유발합니까?
나는 둘 다 잘못 형성되었다고 생각했지만 표준의 관련 부분을 찾을 수 없습니다. [stmt.goto]은 이것에 대해 아무 말도하고도 수행하지 않습니다 [stmt.select] .
표준이 아니라 여기에 대한 정보를 찾을 수 있습니다. en.cppreference.com/w/cpp/language/goto 특히 : "제어 전송이 자동 변수의 범위에 들어간 경우 (예 : 선언을 뛰어 넘음) 성명), 프로그램이 잘못 작성되지 않은 경우 (컴파일 할 수 없음) ... "
—
idclev 463035818
/permissive-
MSVC에 플래그를 추가하면 불만도 표시됩니다. 해당 플래그가없는 MSVC의 동작이 잘 정의되어 있는지 여부는 알 수 없습니다 (그렇다고 가정하면 그렇지 않은 이유는 무엇입니까?).
@walnut "그렇지 않으면 왜 허용 하는가" 아마도 이전 버전과의 호환성을 위해 또는 표준에 너무 신경 쓰지 않기 때문일 수 있습니다. 모든 주요 컴파일러는 기본 설정에서 표준을 준수하지 않습니다.
—
HolyBlackCat
x
점프 후 사용하면 문제가 더 사소한 것 입니다.