/Zc:enumTypes
(啟用列舉類型扣減)
編譯器 /Zc:enumTypes
選項會啟用符合基礎類型和列舉數值型別推算的 enum
C++。
語法
/Zc:enumTypes
[-
]
備註
編譯 /Zc:enumTypes
程式選項會實作符合標準 C++ 的行為,以推斷列舉基底類型和列舉值的類型。
此選項 /Zc:enumTypes
是 Visual 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
,因此 B
應該使用 sizeof(char)
初始化。 在 /Zc:enumTypes
修正之前, A
具有具有推斷基礎型別 的列舉型 Enum
int
別,並使用 B
或 4 初始化 sizeof(Enum)
。
在 Visual Studio 中設定這個編譯器選項
開啟專案的 [屬性頁] 對話方塊。 如需詳細資料,請參閱在 Visual Studio 中設定 C ++ 編譯器和組建屬性。
選取 [組態屬性]>[C/C++]>[命令列] 屬性頁。
在 [其他選項 ] 中,新增
/Zc:enumTypes
或/Zc:enumTypes-
。 選擇 [確定 ] 或 [ 套用 ] 以儲存您的變更。
另請參閱
意見反應
https://aka.ms/ContentUserFeedback。
即將登場:在 2024 年,我們將逐步淘汰 GitHub 問題作為內容的意見反應機制,並將它取代為新的意見反應系統。 如需詳細資訊,請參閱:提交並檢視相關的意見反應