这可能是一个基本问题,但由于某些原因我并不理解。
问题是:Visual Studio中的"Character Set"
属性实际上是什么?
(例如,您可以设置为:Use Unicode Character Set
,Use Multi-Byte Character Set
,Not Set
- 属性中的
我或多或少知道Unicode是什么,但为什么我们需要设置这个属性?
例如,如果我没有设置它并在项目中使用L"hello"
类型的字符串,那就没有意义了吗?
答案 0 :(得分:5)
在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或Multibyte,您将选择正确的函数集。
答案 1 :(得分:2)
当你这样做的时候L"Hello"
您创建宽字符字符串。要使用它,您必须使用std::wstring
或wchar_t
作为单个字符。
在Visual Studio中不要使用例如直接L"Hello"
,而是使用像T
这样的T("Hello")
宏,它会根据您的“字符集”设置做正确的事情。您还应该使用TCHAR
代替char
或wchar_t
。但是没有C ++标准字符串类型,因为它是Visual Studio特定的扩展名,但你可以这样做。
typedef std::basic_string<TCHAR> tstring;
设置Unicode字符集时,编译器将#define
宏_UNICODE
并使用wchar_t
和宽字符串和字符。选择多字节字符后,将不会定义_UNICODE
,而是_MBCS
,而TCHAR
将是正常char
。如果您选择不使用任何一个,则不会定义任何宏,并且将使用正常的char
。
参见例如this link了解更多信息。
答案 2 :(得分:0)
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,如果选择“多字节”,则不会定义。