다음을 통해 공유


경고 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;
}