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