Как назначить значение массиву 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()
, где это необходимо.
Лично я выбираю последнее, но кодировка символов и проблемы перекодирования строк - это просто кошмар время от времени.