4

这可能是一个基本问题,但由于某些原因我不太明白。

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

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

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

4

3 回答 3

7

在 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 或多字节,您将选择正确的功能集。

于 2013-09-23T12:50:09.710 回答
4

例如,当您这样做时,您会L"Hello"创建一个字符串。要使用它,您必须使用std::wstring, 或wchar_t单个字符。

在 Visual Studio 中不要L"Hello"直接使用 eg ,而是使用TT("Hello"),这将根据您的“字符集”设置执行正确的操作。您还应该使用TCHAR代替charor wchar_t。虽然没有 C++ 标准字符串类型,因为它是 Visual Studio 特定的扩展,但您可以例如

typedef std::basic_string<TCHAR> tstring;

当您设置 Unicode 字符集时,编译器将#define_UNICODE和使用wchar_t宽字符串和字符。When the multibyte character is selected, then _UNICODEwill not be defined, instead _MBCSwill be, and TCHARwill be a normal char. 如果您选择不使用任何一个,则不会定义任何宏,char将使用普通宏。

有关更多信息,请参见例如此链接

于 2013-09-23T12:49:44.533 回答
1

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 字符集”时定义,如果选择“多字节”则不定义。

于 2013-09-23T12:53:16.490 回答