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

Никакая 3D поддержка.

16
задан Etan 10 October 2009 в 12:13
поделиться

2 ответа

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

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

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

strcpy(var, "str");

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

21
ответ дан 30 November 2019 в 21:36
поделиться

Прямой ответ см. В ответ авакара . Я собирался добавить это в качестве комментария, но это действительно отдельная рекомендация. Я предупреждаю вас, что это прозвучит как напыщенная речь, но это действительно связано с использованием 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 () , где это необходимо.

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

4
ответ дан 30 November 2019 в 21:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: