Как назначить значение массиву TCHAR

у меня есть TCHAR массив в моем коде C++, который я хочу назначить ему статические строки.

Я установил начальную строку для него через

TCHAR myVariable[260] = TEXT("initial value");

все работает нормально на этом. Однако, когда я разделил его на две строки, как в

TCHAR myVariable[260];
myVariable = TEXT("initial value");

его ошибки и дает ошибку компилятора:

ошибка C2440:'=': не удается преобразовать из' const char [14] 'в'TCHAR [260]'

не TEXT() функция делает именно то, что я хочешь сюда? преобразуйте заданную строку в TCHARs? Почему это работает, когда соединяются две линии? Что я должен изменить, чтобы заставить его работать?

какая-то другая запутанная вещь, с которой я столкнулся:

Я искал в интернете и увидел, что есть еще _T() и _TEXT() и __T() и __TEXT(). Для чего они? Какой из них я должен использовать в какой среде?

2 ответов


почему задание не работает, имеет очень мало общего с TCHARs и _T. Следующее тоже не сработает.

char var[260];
var = "str";   // fails

причина в том, что в C и C++ вы не можете присвоить массивы напрямую. Вместо этого вам нужно скопировать элементы один за другим (используя, например,strcpy, или в вашем случае _tcscpy).

strcpy(var, "str");

Что касается второй части вашего вопроса, TEXT, _T и другие макросы, которые в сборках Unicode превращают строковый литерал в широкий строковый литерал. В сборках, отличных от Unicode, они ничего не делают.


посмотреть ответ авакара для прямого ответа. Я собирался добавить это в качестве комментария, но это действительно стоящая рекомендация. Я предупрежу вас от того, что это будет звучать как тирада, но это происходит от использования TCHAR и тогда проблем работать в течение нескольких лет, прежде чем пытаться удалить его из довольно большой базы кода.

убедитесь, что вы действительно понимаете эффект от использования TCHAR массивы и их друзей. Они обманчиво сложно использовать правильно. Вот краткий список вещей, которые вы должны следить за:

  • sizeof(TCHAR) условно: тщательно изучите код, который содержит это. Если он делает что-либо, кроме вычисления размера, который передается в malloc() или memcpy() тогда это, наверное, неправильно.
  • TCHAR - псевдоним типа: С TCHAR Это не что иное, как typedef, это очень легко писать такие вещи, как wcscpy(tszStr, wszAry) и ничего не поймет. В основном, TCHAR is или char или wchar_t поэтому выбор перегрузки может вас удивить.
  • wsprintf() и swprintf() разные: это особый случай предыдущего, но он заслуживает особого внимания, так как здесь так легко ошибиться!

если вы хотите использовать TCHAR, затем убедитесь, что вы компилируете и UNICODE и MBCS версии регулярно. Если вы не делайте этого, тогда вы, вероятно, собираетесь отменить любое преимущество, которое вы пытаетесь получить, используя их в первую очередь.

вот две рекомендации, которые у меня есть для того, как не использовать TCHAR в первую очередь, когда вы пишете код на C++.

  1. использовать CString если вы используете MFC или удобно привязывать себя к MSFT.
  2. использовать std::string или std::wstring в сочетании с конкретным типом API-use CreateFileA() и CreateFileW() где это уместно.

лично я выбираю последнее, но проблемы кодирования символов и транскодирования строк-это просто кошмар время от времени.