¿Qué hace esto?¿Qué hace L?
const wchar_t *s = L"test";
Si wchar_t es de dos bytes en mi máquina, entonces ¿por qué le decimos al compilador que la cadena debe ser tratada de manera que cada elemento es larga es decir, cuatro bytes de tamaño?
¿Qué hace esto?¿Qué hace L?
const wchar_t *s = L"test";
Si wchar_t es de dos bytes en mi máquina, entonces ¿por qué le decimos al compilador que la cadena debe ser tratada de manera que cada elemento es larga es decir, cuatro bytes de tamaño?
En caso de duda, consulte con el estándar (§6.4.5, literales de cadena):
Una cadena carácter literal es una secuencia de cero o más caracteres de varios bytes encerrados entre comillas dobles, como en
"xyz"
. Una cadena ancha literal es lo mismo, excepto el prefijo letraL
.
Nota que no indican que cada personaje es un long
, a pesar de ser prefijado con la misma letra que el sufijo long
literal.
Gracias, L me estaba confundiendo porque es el sufijo literal largo. – shebaw
L
significa que la cadena es una cadena de caracteres wchar_t
, en lugar de la cadena normal de char
caracteres. No estoy seguro de dónde sacaste el bit de cuatro bytes.
Desde la sección de especificaciones 6.4.5 Los literales de cadena, párrafo 2:
Una cadena carácter literal es una secuencia de cero o más caracteres de varios bytes encerrados entre comillas dobles, como en
"xyz"
. A cadena ancha literal es lo mismo, excepto el prefijo de la letraL
.
Y un extracto de párrafo 5:
para los literales de cadena de caracteres, los elementos de la matriz tienen el tipo
char
, y se inicializan con los bytes individuales de la secuencia de caracteres multibyte; para literales de cadena amplios, los elementos de la matriz tienen el tipowchar_t
, y se inicializan con la secuencia de caracteres anchos correspondientes a la multibyte carácter secuencia, tal como se define por la funciónmbstowcs
con una localización actual definido por la implementación.
El OP probablemente pensó que la 'L' significa' larga ', es decir, 32 bits. –
@JSBangs, pero 'long' no tiene que ser de 4 bytes (o incluso 32 bits) tampoco ... –
sí, pero el OP probablemente tampoco lo sepa. Y, para ser justos, es un error fácil de realizar, ya que el sufijo 'L' en una constante entera * no * lo convierte en' largo' (32 bits, por lo general). Baste decir que el PO está confundido. –
Indica una cadena de caracteres anchos, del tipo wchar_t
.
Si no sabe qué es lo que L
hace, entonces ¿por qué hace una afirmación asertiva sobre cada elemento de la matriz que es long
("cuatro bytes de tamaño")? ¿De dónde vino esa idea con el long
?
Eso L
tiene tanta relación con long
como tiene con "leprechaun" - sin relación alguna. El prefijo L
significa que el siguiente literal de cadena consta de caracteres anchos, es decir, cada carácter tiene el tipo wchar_t
.
P.S. Finalmente, siempre es una buena idea usar punteros calificados const cuando se apunta a literales de cadena: const wchar_t *s = L"test";
.
L
no significa long integer
al prefijar una cadena. Significa que cada personaje en la cadena es un personaje ancho.
Sin este prefijo, está asignando una cadena de char
a un wchar_t
puntero, lo que sería una falta de coincidencia.
¿No debería ser ** const wchar_t * s **? – pic11