什么是Visual Studio中的字符集
What is character set in Visual Studio?
一个基本问题,但由于某些原因,我不太明白。
问题是:Visual Studio 中的 "Character Set"
属性实际上是什么?(例如,您可以设置为: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"
直接使用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
。
例如,请参阅此链接以获取更多信息。
Microsoft 风格的 c 运行时和 Windows API 的标头定义了几个宏和 typedef,这些宏和 typedef 的计算结果取决于此设置的多字节或宽字符变体。例如,在
int _tmain(int argc, _TCHAR* argv[]);
_TCHAR定义如下(简化):
#ifdef _UNICODE
typedef wchar_t _TCHAR;
#else
typedef char _TCHAR;
#endif
这样,相同的代码可以用于多字节和 Unicode 构建。 _UNICODE选择"使用 Unicode 字符集"时定义,如果选择"多字节",则不会定义。
- Visual Studio 2015:Extern "C" 和 "export" 关键字
- 为cl.exe(Visual Studio代码)指定命令行C++版本
- 试图在visual studio上用C++创建一个桌面应用程序
- 如何在MS Visual Studio 2019中运行QT UI
- 如何使用Visual Studio 2017在C++中为参数化对象数组使用唯一指针
- Visual Studio Code - C++ Debugger 無法啟動
- Visual Studio 2019:插入多个C++风格的单行注释
- Visual Studio Code "undefined reference to `WinMain@16'"
- Visual studio代码重构似乎不起作用(例如,重命名符号-f2)
- Visual Studio中的函数声明和函数定义问题
- 如何指定我希望我的LIB链接到的DLL文件?-Visual Studio 2019
- Visual Studio mkl_link_tool.exe链接错误
- Visual Studio(或任何其他工具)能否将地址解释为调用堆栈(boost上下文)的开头
- 不同的Visual Studio版本中缺少.dll
- 用Visual Studio在C++中嵌入Julia
- 使用 Visual Studio C++ 在控制台中控制字体和字符集
- Visual Studio 的字符集编码
- 从多字节字符集转换旧的Visual Studio C++项目
- 什么是Visual Studio中的字符集
- Visual Studio 字符集 'Not set' vs 'Multi byte character set'