2009-10-10 4 views
14

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

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

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

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

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

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

error C2440: '=': cannot convert from 'const char [14]' to 'TCHAR [260]'

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

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

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

ответ

19

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

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

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

strcpy(var, "str"); 

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

+1

+1 для avakar. На боковой ноте используйте TCHAR вместо WCHAR или char, в зависимости от настроек вашего проекта (Unicode/ASCII) макрос TCHAR будет определен как WCHAR/char. И также используйте _t на основе защищенных функций, таких как _tcscpy_s, _tcscat_s и т. Д., Которые будут определены снова на основе вашего проекта. как wcscpy или strcpy. Мои 2 цента. – legends2k

+0

Я пробовал это, получил эту ошибку: ошибка C2664: 'wcscpy': не может преобразовать параметр 2 из 'const char [8]' в 'const wchar_t *' –

+0

@ user396483, попробовал что? Вы, очевидно, смешиваете версии str, _tcs и wcs вместе. – avakar

5

See avakar's answer for the direct answer. I was going to add this as a comment, but it really is a freestanding recommendation. I will warn you up from that this will sound like a rant but it does come from using TCHAR and then working issues for a few years before trying to remove it from a rather large codebase.

Убедитесь, что вы действительно понимаете эффект использования 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(), где это необходимо.

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

+0

+1, я изначально считал, что пишу подобное сочинение. Лично я всегда использую 'std :: string' с кодированными данными utf-8, перекодируя только на границах API (т. Е. Перед вызовами API win32). – avakar

+0

@avakar: мы выполнили как UTF-8 + std :: string, так и UCS-2 + std :: wstring. Я перешел к более позднему, так как случайное свертывание и сравнение в Юникоде намного проще, чем UTF-8. –

 Смежные вопросы

  • Нет связанных вопросов^_^