Причина, по которой присвоение не работает, очень мало связана с TCHAR
s и _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
- это либо char
, либо wchar_t
, поэтому выбор перегрузки может вас удивить. wsprintf ()
и swprintf ()
разные : Это частный случай предыдущего, но он требует особого внимания, так как здесь очень легко ошибиться! Если вы хотите использовать TCHAR
, убедитесь, что вы регулярно компилируете как UNICODE, так и версии MBCS. Если вы этого не сделаете, то вы, вероятно, потеряете любое преимущество, которое пытаетесь получить, в первую очередь используя их.
Вот две рекомендации, которые у меня есть, как не использовать TCHAR
в первую очередь, когда вы пишете код на C ++.
CString
, если вы используете MFC или привыкли к MSFT. std :: string
] или std :: wstring
в сочетании с API для конкретных типов - используйте CreateFileA ()
и CreateFileW ()
, где это необходимо. Лично я выберите последнее, но проблемы с кодировкой символов и перекодировкой строк время от времени становятся просто кошмаром.