Как присвоить значение массиву TCHAR - PullRequest
16 голосов
/ 10 октября 2009

В моем коде C ++ есть массив TCHAR, которому я хочу присвоить ему статические строки.

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

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

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

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

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

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

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

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

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

Ответы [ 2 ]

21 голосов
/ 10 октября 2009

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

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

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

strcpy(var, "str");

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

5 голосов
/ 10 октября 2009

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

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

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

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

Вот две мои рекомендации о том, как не использовать TCHAR во-первых, когда вы пишете код на C ++.

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

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

...