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

У меня есть массив TCHAR в моем С++-коде, который я хочу присвоить ему статические строки.

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

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

Все отлично работает. Однако, когда я разбиваю его на две строки, как в

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

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

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

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

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

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

Ответы

Ответ 1

Причина, по которой назначение не работает, имеет очень мало отношения к TCHAR и _T. Следующее не будет работать.

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

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

strcpy(var, "str");

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

Ответ 2

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

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

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

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

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

  • Используйте CString, если вы используете MFC или можете удобно привязывать себя к MSFT.
  • Используйте std::string или std::wstring в сочетании с API-интерфейсом типа - используйте CreateFileA() и CreateFileW(), где это необходимо.

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