Visual Studio中的字符集是什么?

时间:2013-09-23 12:42:55

标签: c++

这可能是一个基本问题,但由于某些原因我并不理解。

问题是:Visual Studio中的"Character Set"属性实际上是什么? (例如,您可以设置为:Use Unicode Character SetUse Multi-Byte Character SetNot Set - 属性中的

我或多或少知道Unicode是什么,但为什么我们需要设置这个属性?

例如,如果我没有设置它并在项目中使用L"hello"类型的字符串,那就没有意义了吗?

3 个答案:

答案 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::wstringwchar_t作为单个字符。

在Visual Studio中不要使用例如直接L"Hello",而是使用像T这样的T("Hello")宏,它会根据您的“字符集”设置做正确的事情。您还应该使用TCHAR代替charwchar_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,如果选择“多字节”,则不会定义。