注意:"unsigned" 说明符会更改 Visual Studio 中 wchar_t 类型的大小
Be careful: the "unsigned" specifier changes the size of the wchar_t type in Visual Studio
将 unsigned
说明符添加到 Visual Studio 中的 wchar_t
类型会将类型大小从 2 字节更改为 4 字节。
通过运行以下两行代码在Visual Studio2008年,或者在最新的Visual Studio2019年:
cout << "wchar_t: " << sizeof(wchar_t) << endl;
cout << "unsigned wchar_t: " << sizeof(unsigned wchar_t) << endl;
你得到 2
for wchar_t
和 4
for unsigned wchar_t
和警告 C4076 ('unsigned': cannot be used with type 'wchar_t').
预期的行为是保留 2 个字节的大小。 documentation says 没有改变大小,只是告诉我们使用编译器选项使 whcar_t 成为 unsigned short 的类型定义:
Microsoft-specific: By default, wchar_t is a native type, but you can use /Zc:wchar_t- to make wchar_t a typedef for unsigned short. The __wchar_t type is a Microsoft-specific synonym for the native wchar_t type.
这可能是启用“将警告视为错误”编译器选项并遵循零警告规则的另一个原因。
至少对于新项目而言。不幸的是,在使用遗留代码时可能很难甚至不可能遵循此规则。
我认为visual studio在这里是正确的,unsigned wchar_t
(或signed wchar_t
)没有provision in the standard,所以这取决于编译器如何处理它。虽然错误会很好(由 GCC 和 Clang 提出),但警告也可以。
大概 4 个字节是因为 Visual Studio 必须决定丢弃 unsigned
或 wchar_t
之一并决定丢弃 wchar_t
给你留下 unsigned int
.
将 unsigned
说明符添加到 Visual Studio 中的 wchar_t
类型会将类型大小从 2 字节更改为 4 字节。
通过运行以下两行代码在Visual Studio2008年,或者在最新的Visual Studio2019年:
cout << "wchar_t: " << sizeof(wchar_t) << endl;
cout << "unsigned wchar_t: " << sizeof(unsigned wchar_t) << endl;
你得到 2
for wchar_t
和 4
for unsigned wchar_t
和警告 C4076 ('unsigned': cannot be used with type 'wchar_t').
预期的行为是保留 2 个字节的大小。 documentation says 没有改变大小,只是告诉我们使用编译器选项使 whcar_t 成为 unsigned short 的类型定义:
Microsoft-specific: By default, wchar_t is a native type, but you can use /Zc:wchar_t- to make wchar_t a typedef for unsigned short. The __wchar_t type is a Microsoft-specific synonym for the native wchar_t type.
这可能是启用“将警告视为错误”编译器选项并遵循零警告规则的另一个原因。
至少对于新项目而言。不幸的是,在使用遗留代码时可能很难甚至不可能遵循此规则。
我认为visual studio在这里是正确的,unsigned wchar_t
(或signed wchar_t
)没有provision in the standard,所以这取决于编译器如何处理它。虽然错误会很好(由 GCC 和 Clang 提出),但警告也可以。
大概 4 个字节是因为 Visual Studio 必须决定丢弃 unsigned
或 wchar_t
之一并决定丢弃 wchar_t
给你留下 unsigned int
.