在 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
。
wcout
同时支持 ansi 字符和 wchar_t
字符
wcout
比 XXXprintf
更安全,因为它 "knows" 它应该打印什么样的参数(避免像 printf("%s",'a');
这样的惨败)
- 它是便携式的,而
_tprintf
不是
- 它是多态的,可以与其他流一起工作(如
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
Mapping format specifier
%s
to%ls
when_tprintf()
is mapped towprintf()
?
我正在使用 _T()
宏将字符串映射到 ASCII 或 Unicode,具体取决于是否定义了 _UNICODE
。
但是,像 _tprintf("%s", _T("text string"))
这样的调用给我带来了麻烦,因为在定义 _UNICODE
时类型不一致。
我看到 %ls
应该用于 Unicode 字符串。
定义_UNICODE
时,如何将%s
直接映射到%ls
?有没有像_T()?
解决方法是不使用_tprintf
,而是使用std::wcout
。
wcout
同时支持 ansi 字符和wchar_t
字符wcout
比XXXprintf
更安全,因为它 "knows" 它应该打印什么样的参数(避免像printf("%s",'a');
这样的惨败)- 它是便携式的,而
_tprintf
不是 - 它是多态的,可以与其他流一起工作(如
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