경고 C26427
전역 이니셜라이저가 extern 개체 'symbol'(i.22)에 액세스합니다.
C++ 핵심 지침: I.22: 전역 개체의 복잡한 초기화 방지
전역 개체는 일관되지 않거나 정의되지 않은 순서로 초기화될 수 있습니다. 즉, 상호 종속성이 위험하므로 피해야 합니다. 이 지침은 이니셜라이저가 다른 개체를 참조할 때 적용됩니다 extern
.
설명
개체는 다음 규칙을 준수하는 것으로 간주됩니다 extern
.
- 지정자가 표시된
extern
전역 변수이거나 클래스의 정적 멤버입니다. - 익명 네임스페이스에 있지 않습니다.
- 로 표시되지
const
않습니다. - 정적 클래스 멤버는 전역으로 간주되므로 이니셜라이저도 확인됩니다.
코드 분석 이름: NO_GLOBAL_INIT_EXTERNS
예시
외부 버전 확인:
// api.cpp
int api_version = API_DEFAULT_VERSION; // Assume it can change at run time, hence non-const.
// client.cpp
extern int api_version;
bool is_legacy_mode = api_version <= API_LEGACY_VERSION; // C26427, also stale value
외부 버전 검사를 통해 더 안정적으로 수행되었습니다.
// api.cpp
int api_version = API_DEFAULT_VERSION; // Assume it can change at run time, hence non-const.
// client.cpp
extern int api_version;
bool is_legacy_mode() noexcept
{
return api_version <= API_LEGACY_VERSION;
}