Спецификатор формата отображения
%s
в%ls
когда_tprintf()
сопоставлен сwprintf()
?
Я использую _T()
макрос для отображения строк в ASCII или Unicode, в зависимости от того, _UNICODE
определено.
Тем не менее, звонок как _tprintf("%s", _T("text string"))
причиняет мне неприятности из-за несовместимых типов, когда _UNICODE
определено.
я вижу это %ls
следует использовать для строк Unicode.
Как может %s
быть сопоставлены непосредственно с %ls
когда _UNICODE
определено? Есть ли какая-то необычная функция вроде _T()?
Тем не менее, звонок как
_tprintf("%s", _T("text string"))
вызывает меня
проблемы из-за несовместимых типов, когда_UNICODE
определено.
Вы должны использовать _T()
Декоратор также для первого строкового литерала (то есть строки спецификатора формата) _tprintf()
:
// NOTE: _T("%s"), not just "%s"//
_tprintf(_T("%s"), _T("text string"));
Это расширено в сборках ANSI:
printf("%s", "text string"); // %s maps to char* ANSI string
и в Юникоде строит для:
wprintf(L"%s", L"text string"); // %s maps to wchar_t* Unicode string
Решение состоит в том, чтобы не использовать _tprintf
но использовать std::wcout
,
wcout
поддерживает как ANSI символов и wchar_t
персонажиwcout
тогда безопаснее XXXprintf
потому что он «знает», какие параметры он должен печатать (избегайте таких фиаско, как printf("%s",'a');
)_tprintf
не являетсяfstream
и тому подобное) , _tprintf
не является.единственные минусы xxxcout
является то, что он имеет тенденцию немного раздувать исполняемый файл и немного медленнее printf
семью, но я действительно думал, что это будет реальным недостатком в вашем приложении.
угробить printf
как функции в пользу потоков C ++.