这可能是一个基本问题,但由于某些原因我不太明白。
问题是:"Character Set"
Visual Studio 中的实际属性是什么?(例如,您可以在属性中设置为: Use Unicode Character Set
, Use Multi-Byte Character Set
, - )Not Set
我或多或少知道 Unicode 是什么,但是为什么我们需要设置这个属性呢?
例如,如果我不设置它并L"hello"
在项目中使用字符串类型,它会没有意义吗?
这可能是一个基本问题,但由于某些原因我不太明白。
问题是:"Character Set"
Visual Studio 中的实际属性是什么?(例如,您可以在属性中设置为: Use Unicode Character Set
, Use Multi-Byte Character Set
, - )Not Set
我或多或少知道 Unicode 是什么,但是为什么我们需要设置这个属性呢?
例如,如果我不设置它并L"hello"
在项目中使用字符串类型,它会没有意义吗?
在 Visual Studio 中设置Character Set
选项将为您定义一些预处理器符号:
Unicode
将定义_UNICODE
Use Multi-byte Character Set
将定义_MBCS
Not Set
不会定义任何这些。现在,如果你从 SDK 中查看一些头文件,你会看到这些:
#ifdef _UNICODE
#define GetDeltaInfo GetDeltaInfoW
#else
#define GetDeltaInfo GetDeltaInfoA
#endif /* _UNICODE */
其中 W 和 A 函数是:
BOOL
WINAPI
GetDeltaInfoA(
__in LPCSTR lpDeltaName,
__out LPDELTA_HEADER_INFO lpHeaderInfo
);
/**
* Gets header information for a delta accessed by Unicode file name.
* @param lpDeltaName Delta file name, Unicode.
* @param lpHeaderInfo Header information for given Delta.
* @return TRUE if success, FALSE otherwise.
*/
BOOL
WINAPI
GetDeltaInfoW(
__in LPCWSTR lpDeltaName,
__out LPDELTA_HEADER_INFO lpHeaderInfo
);
因此,通过设置 Unicode 或多字节,您将选择正确的功能集。
例如,当您这样做时,您会L"Hello"
创建一个宽字符串。要使用它,您必须使用std::wstring
, 或wchar_t
单个字符。
在 Visual Studio 中不要L"Hello"
直接使用 eg ,而是使用T
宏T("Hello")
,这将根据您的“字符集”设置执行正确的操作。您还应该使用TCHAR
代替char
or wchar_t
。虽然没有 C++ 标准字符串类型,因为它是 Visual Studio 特定的扩展,但您可以例如
typedef std::basic_string<TCHAR> tstring;
当您设置 Unicode 字符集时,编译器将#define
宏_UNICODE
和使用wchar_t
宽字符串和字符。When the multibyte character is selected, then _UNICODE
will not be defined, instead _MBCS
will be, and TCHAR
will be a normal char
. 如果您选择不使用任何一个,则不会定义任何宏,char
将使用普通宏。
有关更多信息,请参见例如此链接。
Microsoft 风格的 c 运行时和 Windows API 的标头定义了几个宏和 typedef,根据此设置评估为多字节或宽字符变体。例如,在
int _tmain(int argc, _TCHAR* argv[]);
_TCHAR 定义如下(简化):
#ifdef _UNICODE
typedef wchar_t _TCHAR;
#else
typedef char _TCHAR;
#endif
这样,相同的代码可用于多字节和 unicode 构建。_UNICODE 在选择“使用 Unicode 字符集”时定义,如果选择“多字节”则不定义。