Windows — Отображение спецификаторов формата, когда Unicode определен в C ++?

Спецификатор формата отображения %s в %ls когда _tprintf() сопоставлен с wprintf()?

Я использую _T() макрос для отображения строк в ASCII или Unicode, в зависимости от того, _UNICODE определено.

Тем не менее, звонок как _tprintf("%s", _T("text string")) причиняет мне неприятности из-за несовместимых типов, когда _UNICODE определено.

я вижу это %ls следует использовать для строк Unicode.

Как может %s быть сопоставлены непосредственно с %ls когда _UNICODE определено? Есть ли какая-то необычная функция вроде _T()?

2

Решение

Тем не менее, звонок как _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
1

Другие решения

Решение состоит в том, чтобы не использовать _tprintf но использовать std::wcout,

  1. wcout поддерживает как ANSI символов и wchar_t персонажи
  2. wcout тогда безопаснее XXXprintf потому что он «знает», какие параметры он должен печатать (избегайте таких фиаско, как printf("%s",'a');)
  3. его портативный в то время как _tprintf не является
  4. это полиморфно и может работать с другими потоками (например, fstream и тому подобное) , _tprintf не является.

единственные минусы xxxcout является то, что он имеет тенденцию немного раздувать исполняемый файл и немного медленнее printf семью, но я действительно думал, что это будет реальным недостатком в вашем приложении.

угробить printf как функции в пользу потоков C ++.

1

По вопросам рекламы [email protected]