C : LPWSTR печатается как адрес в cout

#c #pointers #unicode #cout

#c #указатели #юникод #cout

Вопрос:

У меня есть переменная типа LPTSTR , которую я печатаю std::cout с << помощью. В системе ANSI (не знаю точно, где это определено) все работало нормально, она печатала строку. Теперь в системе Unicode я получаю шестнадцатеричный адрес вместо строки. Итак, почему LPSTR (на который LPTSTR разрешается, если UNICODE не определено) действует иначе, чем LPWSTR (… если UNICODE определено) и как мне напечатать строку, на которую указывает последнее?

Ответ №1:

Для строк в Юникоде, которые вы хотите wcout .

Возможно, вы видите шестнадцатеричное значение, потому что выходной поток ANSI / ASCII не знает, как обрабатывать символы Unicode.

LPTSTR и LPWSTR на самом деле являются C-измами, унаследованными со времен C Windows API. Для C я бы настоятельно рекомендовал вам использовать вместо этого std::string и / или std::wstring .

Если вам нужно создать свой собственный макрос, вам понадобится что-то вроде:

 #ifdef _UNICODE
std::wostreamamp; COUT = std::wcout;
#else
std::ostreamamp; COUT = std::cout;
#endif
  

Комментарии:

1. О, спасибо. И есть ли стандартные макросы, которые автоматически преобразуются в cout или wcout?

2. И об использовании std::string — к сожалению, LPTSTRs используются в функциях WinAPI, поэтому я должен их использовать. И чтобы избежать ненужных преобразований, я должен использовать их все время.

3. Вы можете использовать метод .c_str(), если хотите, чтобы строка в стиле C, заканчивающаяся нулем, передавалась в Windows API.

4. Что касается стандартного макроса: я не уверен (в эти дни я в основном занимаюсь C #). Если я правильно помню, мне пришлось создать свой собственный, но это было несколько лет назад. Это не должно быть слишком сложно. Смотрите отредактированный ответ.

5. Я бы использовал std::wostreamamp; COUT = std::wcout; and std::wostreamamp; COUT = std::cout; вместо #define COUT wcout и #define COUT cout