다음을 통해 공유


컴파일러 경고(수준 4) C4459

'identifier' 선언은 전역 선언을 숨깁니다.

로컬 범위의 식별자 선언은 전역 범위에서 동일한 이름의 식별자 선언을 숨깁니다. 이 경고는 이 범위의 식별자에 대한 참조가 의도일 수도 있고 그렇지 않을 수도 있는 전역 버전이 아니라 로컬로 선언된 버전으로 확인된다는 것을 알 수 있습니다. 일반적으로 전역 변수를 좋은 엔지니어링 사례로 사용하는 것을 최소화하는 것이 좋습니다. 전역 네임스페이스의 오염을 최소화하려면 전역 변수에 명명된 네임스페이스를 사용하는 것이 좋습니다.

이 경고는 Microsoft C++ 컴파일러 버전 18.00의 Visual Studio 2015에서 새로 추가되었습니다. 코드를 마이그레이션하는 동안 해당 버전의 컴파일러 이상에서 경고를 표시하지 않도록 하려면 /Wv:18 컴파일러 옵션을 사용합니다.

예시

다음 샘플에서는 C4459를 생성합니다.

// C4459_hide.cpp
// compile with: cl /W4 /EHsc C4459_hide.cpp
int global_or_local = 1;

int main() {
    int global_or_local; // warning C4459
    global_or_local = 2;
}

이 문제를 해결하는 한 가지 방법은 전역에 대한 네임스페이스를 만드는 것이지만 지시문을 사용하여 using 해당 네임스페이스를 범위로 가져오지 않으므로 모든 참조는 명확한 정규화된 이름을 사용해야 합니다.

// C4459_namespace.cpp
// compile with: cl /W4 /EHsc C4459_namespace.cpp
namespace globals {
    int global_or_local = 1;
}

int main() {
    int global_or_local; // OK
    global_or_local = 2;
    globals::global_or_local = 3;
}