다음을 통해 공유


/Zc:gotoScope (goto 범위에서 규칙 적용)

/Zc:gotoScope 컴파일러 옵션을 사용하면 지역 변수의 초기화를 뛰어넘는 문에 goto 대한 표준 C++ 동작을 검사할 수 있습니다.

구문

/Zc:gotoScope[-]

설명

/Zc:gotoScope 컴파일러 옵션은 하나 이상의 지역 변수의 초기화를 뛰어 넘는 문에 goto 대해 C++ 표준 동작을 적용합니다. 컴파일러는 지정된 경우 이러한 모든 경우에 오류 C2362 를 내보낸다 /Zc:gotoScope . 이 /Zc:gotoScope- 검사를 완화하지만, 사소한 소멸자가 아닌 지역 변수의 초기화를 건너뛰면 goto 컴파일러가 여전히 오류를 내보낸다.

이 옵션의 /Zc:gotoScope- 목적은 이전 코드 베이스를 보다 규칙적인 코드로 쉽게 마이그레이션하는 데 도움이 되는 것입니다. 비준수 코드를 업데이트할 때까지 특정 오류를 표시하지 않는 데 사용할 수 있습니다.

/Zc:gotoScope 컴파일러 옵션은 Visual Studio 2022 버전 17.4의 새로운 기능입니다. 옵션은 기본적으로 꺼져 있습니다. 옵션(또는 같은 또는 )을 의미하는 /permissive-/std:c++20 /std:c++latest옵션에 의해 /permissive- 자동으로 사용하도록 설정됩니다. 오류 검사를 명시적으로 사용하도록 설정하려면 컴파일러 명령줄에 추가 /Zc:gotoScope 합니다. 확인을 명시적으로 사용하지 않도록 설정하려면 이 /Zc:gotoScope- 옵션을 사용합니다. /Zc:gotoScope- 옵션 또는 해당 옵션을 의미하는 /permissive-옵션 후에 /permissive- 나타나야 합니다.

예시

이 샘플에서는 다음을 사용하여 /Zc:gotoScope컴파일할 때 오류 메시지를 생성합니다.

int g(int*);
bool failed(int);

int f() {
    int v1;
    auto result = g(&v1);
    if (failed(result))
        goto OnError;
    int v2 = v1 + 2;
    return v2;
OnError:
    return -1;
}

/* Output:
t.cpp(9): error C2362: initialization of 'v2' is skipped by 'goto OnError'
*/

코드가 컴파일된 /Zc:gotoScope-경우 컴파일러는 오류를 내보내지 않습니다.

지정한 경우에도 /Zc:gotoScope- 지역 변수에 사소한 소멸자가 없는 경우 컴파일러는 여전히 오류를 내보낸다. 예시:

int g(int*);
bool failed(int);

class S {
public:
    S(int);
    ~S();
    int mf() const;
};

int f()
{
    int v1;
    auto result = g(&v1);
    if (failed(result))
        goto OnError;
    S s(v1);
    return s.mf();

OnError:
    return -1;
}

/* Output:
t.cpp(17): error C2362: initialization of 's' is skipped by 'goto OnError'
*/

Visual Studio에서 이 컴파일러 옵션을 설정하려면

  1. 프로젝트의 속성 페이지 대화 상자를 엽니다. 자세한 내용은 Visual Studio에서 C++ 컴파일러 및 빌드 속성 설정을 참조하세요.

  2. 구성 속성>C/C++>명령줄 속성 페이지를 선택합니다.

  3. 추가 옵션에서 /Zc:gotoScope 또는 /Zc:gotoScope-을(를) 추가합니다. 확인을 선택하거나 적용을 선택하여 변경 내용을 저장합니다.

참고 항목

/Zc(규칙)
/permissive-
/std(언어 표준 버전 지정)