Share via


/Zc:enumTypes (열거형 형식 추론 사용)

/Zc:enumTypes 컴파일러 옵션을 사용하면 C++가 기본 형식 및 열거자 형식 추론을 준수할 enum 수 있습니다.

구문

/Zc:enumTypes[-]

설명

/Zc:enumTypes 컴파일러 옵션은 열거형 기본 형식 및 열거자 형식의 추론에 대한 표준 C++ 준수 동작을 구현합니다.

Visual /Zc:enumTypes Studio 2022 버전 17.4의 새로운 옵션입니다. 이 옵션은 기본적으로 해제되어 있으며 /permissive-. 옵션을 명시적으로 사용하지 않도록 설정하려면 .를 사용합니다 /Zc:enumTypes-.

사용하도록 설정하면 /Zc:enumTypes 옵션은 잠재적인 원본 및 이진 호환성이 손상되는 변경입니다. 일부 열거형 형식은 준수 /Zc:enumTypes 옵션을 사용하도록 설정하면 크기가 변경됩니다. 특정 Windows SDK 헤더에는 이러한 열거형 정의가 포함됩니다.

C++ 표준을 사용하려면 열거형의 기본 형식이 선언된 모든 열거자를 저장할 수 있을 만큼 커야 합니다. 충분히 큰 열거자는 enum의 기본 형식을 unsigned int, long long 또는 unsigned long long로 설정할 수 있습니다. 이전에는 열거자 값에 관계없이 이러한 열거형 형식은 항상 Microsoft 컴파일러의 int 기본 형식을 사용했습니다.

또한 C++ 표준은 고정된 기본 형식이 없는 열거형 정의 내에서 열거자의 형식이 이니셜라이저에 의해 결정되도록 지정합니다. 또는 이니셜라이저가 없는 열거자의 경우 이전 열거자의 형식으로 지정합니다(오버플로를 고려). 이전에는 이러한 열거자에 항상 기본 형식(일반적으로 int)에 대한 자리 표시자와 함께 추론된 열거형 형식이 주어졌습니다.

Visual Studio 2022 버전 17.4 이전 버전의 Visual Studio에서 C++ 컴파일러는 고정된 기본 형식이 없는 범위가 지정되지 않은 열거형의 기본 형식을 정확하게 결정하지 못했습니다. 컴파일러도 열거자 형식을 올바르게 모델링하지 않았습니다. 열거형의 닫는 중괄호 앞에 고정된 기본 형식이 없는 열거형에서 잘못된 형식을 가정할 수 있습니다. 아래에서 /Zc:enumTypes컴파일러는 표준 동작을 올바르게 구현합니다.

예: 고정 형식이 없는 범위 enum 없는 기본 형식

enum Unsigned
{
    A = 0xFFFFFFFF // Value 'A' does not fit in 'int'.
};

// Previously, this static_assert failed. It passes with /Zc:enumTypes.
static_assert(std::is_same_v<std::underlying_type_t<Unsigned>, unsigned int>);

template <typename T>
void f(T x)
{
}

int main()
{
    // Previously called f<int>, now calls f<unsigned int>.
    f(+A);
}

// Previously, this enum would have an underlying type of `int`,
// but Standard C++ requires this to have a 64-bit underlying type.
// The /Zc:enumTypes option changes the size of this enum from 4 to 8,
// which could impact binary compatibility with code compiled with an
// earlier compiler version, or without the switch.
enum Changed
{
    X = -1,
    Y = 0xFFFFFFFF
};

예: 고정된 기본 형식이 enum 없는 정의 내의 열거자

enum Enum {
    A = 'A',
    B = sizeof(A)
};

static_assert(B == 1); // previously failed, now succeeds under /Zc:enumTypes

이 예제에서 열거자 A는 열거형의 닫는 중괄호 앞에 형식 char가 있어야 하므로 Bsizeof(char)를 사용하여 초기화해야 합니다. /Zc:enumTypes 수정 전에는 A가 추론된 기본 형식 int인 열거형 형식 Enum을 사용했으며, Bsizeof(Enum) 또는 4를 사용하여 초기화되었습니다.

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

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

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

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

참고 항목

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