tablas - matrices en c++
Cómo asignar un valor a una matriz TCHAR (2)
Tengo una matriz TCHAR
en mi código C ++ que quiero asignarle cadenas estáticas.
Le puse una cadena inicial a través de
TCHAR myVariable[260] = TEXT("initial value");
Todo funciona bien en esto. Sin embargo, cuando lo divido en dos líneas como en
TCHAR myVariable[260];
myVariable = TEXT("initial value");
falla y da un error de compilación:
error C2440: ''='': no se puede convertir de ''const char [14]'' a ''TCHAR [260]''
¿No debería la función TEXT()
hacer exactamente lo que quiero aquí? convertir la cadena dada a TCHAR
s? ¿Por qué funciona, al juntar las dos líneas? ¿Qué tengo que cambiar para que funcione?
Alguna otra cosa confusa que he encontrado:
He buscado en Internet para encontrarlo y he visto que también hay _T()
y _TEXT()
y __T()
y __TEXT()
. ¿Para qué son? ¿Cuál de ellos debería usar en qué entorno?
Vea la respuesta de avakar para la respuesta directa. Iba a agregar esto como un comentario, pero realmente es una recomendación independiente. Le advertiré que esto suena como una perorata, pero sí viene del uso de
TCHAR
y luego problemas de funcionamiento durante algunos años antes de intentar eliminarlo de una base de códigos bastante grande.
Asegúrate de que realmente entiendes el efecto del uso de matrices TCHAR
y sus amigos. Son engañosamente difíciles de usar correctamente. Aquí hay una breve lista de cosas que debes tener en cuenta:
-
sizeof(TCHAR)
es condicional : examine el código que lo contiene. Si está haciendo algo más que calcular el tamaño que se está pasando amalloc()
omemcpy()
entonces es probable que esté mal. -
TCHAR
es un alias de tipo : dado queTCHAR
no es más que untypedef
, es realmente fácil escribir cosas comowcscpy(tszStr, wszAry)
y no ser más sabio. Básicamente,TCHAR
eschar
owchar_t
por lo que las selecciones de sobrecarga pueden sorprenderlo. -
wsprintf()
yswprintf()
son diferentes : este es un caso especial del anterior, pero tiene una consideración especial ya que es muy fácil cometer un error aquí.
Si desea utilizar TCHAR
, asegúrese de compilar las versiones de UNICODE y MBCS con regularidad. Si no lo hace, entonces probablemente deshará cualquier ventaja que esté tratando de obtener al utilizarlos en primer lugar.
Aquí hay dos recomendaciones que tengo sobre cómo no usar TCHAR
en primer lugar cuando está escribiendo código C ++.
- Use
CString
si está usando MFC o si se siente cómodo atándose a MSFT. - Use
std::string
ostd::wstring
junto con la API específica del tipo; useCreateFileA()
yCreateFileW()
cuando sea apropiado.
Personalmente, elijo este último, pero los problemas de codificación de caracteres y transcodificación de cadenas son solo una pesadilla de vez en cuando.
La razón por la que la asignación no funciona tiene muy poco que ver con TCHAR
s y _T
. Lo siguiente tampoco funcionará.
char var[260];
var = "str"; // fails
La razón es que en C y C ++ no se pueden asignar matrices directamente. En su lugar, debe copiar los elementos uno por uno (utilizando, por ejemplo, strcpy
, o en su caso _tcscpy
).
strcpy(var, "str");
Con respecto a la segunda parte de su pregunta, TEXT
, _T
y las otras son macros, que en las compilaciones Unicode convierten un literal de cadena en un literal de cadena ancha. En construcciones no Unicode no hacen nada.