在 C++ 中定义 Unicode 时映射格式说明符?

Mapping format specifiers when Unicode is defined in C++?

Mapping format specifier %s to %ls when _tprintf() is mapped to wprintf()?

我正在使用 _T() 宏将字符串映射到 ASCII 或 Unicode,具体取决于是否定义了 _UNICODE

但是,像 _tprintf("%s", _T("text string")) 这样的调用给我带来了麻烦,因为在定义 _UNICODE 时类型不一致。

我看到 %ls 应该用于 Unicode 字符串。

定义_UNICODE时,如何将%s直接映射到%ls?有没有像_T()?

这样的奇特函数

解决方法是不使用_tprintf,而是使用std::wcout

  1. wcout 同时支持 ansi 字符和 wchar_t 字符
  2. wcoutXXXprintf 更安全,因为它 "knows" 它应该打印什么样的参数(避免像 printf("%s",'a'); 这样的惨败)
  3. 它是便携式的,而 _tprintf 不是
  4. 它是多态的,可以与其他流一起工作(如 fstream 等),_tprintf 不是。

xxxcout 的唯一缺点是它会使可执行文件膨胀一点,并且比 printf 系列慢一点,但我真的认为它会成为您的真正缺点应用

放弃 printf 类函数,转而使用 C++ 流。

However, a call like _tprintf("%s", _T("text string")) is causing me trouble, because of inconsistent types when _UNICODE is defined.

您应该对 _tprintf():

的第一个字符串文字(即格式说明符字符串)也使用 _T() 装饰器
// NOTE: _T("%s"), not just "%s"
//
_tprintf(_T("%s"), _T("text string"));

这在 ANSI 构建中扩展为:

printf("%s", "text string"); // %s maps to char* ANSI string

并在 Unicode 中构建为:

wprintf(L"%s", L"text string"); // %s maps to wchar_t* Unicode string