다음을 통해 공유


컴파일러 경고 C5038

데이터 멤버 'member1'은 데이터 멤버 'member2' 후에 초기화됩니다.
데이터 멤버 'member'는 기본 클래스 'base_class' 후에 초기화됩니다.

설명

클래스 멤버는 이니셜라이저 목록에 표시되는 순서가 아니라 선언된 순서대로 초기화됩니다. 컴파일러는 초기화 순서가 데이터 멤버 또는 기본 클래스의 선언 순서와 같지 않을 때 경고합니다. 순서는 정의되지 않은 런타임 동작으로 이어질 수 있습니다. 예를 들어 목록에서 한 멤버의 초기화는 나중에 선언된 멤버의 초기화에 따라 달라집니다.

이 경고는 Visual Studio 2017 버전 15.3의 새로운 기능이며 기본적으로 꺼져 있습니다. 기본적으로 꺼져 있는 모든 경고를 사용하도록 설정하거나 /w15038 C5038을 수준 1 경고로 사용하도록 설정하는 데 사용합니다/Wall. 자세한 내용은 기본적으로 꺼져 있는 컴파일러 경고를 참조하세요. 컴파일러 버전별 경고를 사용하지 않도록 설정하는 방법에 대한 자세한 내용은 컴파일러 버전별 컴파일러 경고를 참조하세요.

예시

다음 예제에서 컴파일러(/w15038을 사용하는 경우)는 "경고 C5038: 데이터 멤버 'A::y'가 데이터 멤버 'A::x' 후에 초기화됩니다."를 발생합니다.

// C5038.cpp
// Compile using: cl /EHsc /c /w15038 C5038.cpp
struct A
{
    A(int a) : y(a), x(y) {} // C5038, Initialized in reverse, y reused
    int x;
    int y;
};

이 문제를 해결하려면 선언과 순서가 같도록 이니셜라이저 목록을 정렬합니다. 하나 또는 두 이니셜라이저가 기본 클래스 구성원을 참조하는 경우 유사한 경고가 발생합니다.