2011-04-15 30 views
10

¿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?

+0

¿No debería ser ** const wchar_t * s **? – pic11

Respuesta

5

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 letra L.

Nota que no indican que cada personaje es un long, a pesar de ser prefijado con la misma letra que el sufijo long literal.

+0

Gracias, L me estaba confundiendo porque es el sufijo literal largo. – shebaw

15

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 letra L.

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 tipo wchar_t, y se inicializan con la secuencia de caracteres anchos correspondientes a la multibyte carácter secuencia, tal como se define por la función mbstowcs con una localización actual definido por la implementación.

+0

El OP probablemente pensó que la 'L' significa' larga ', es decir, 32 bits. –

+0

@JSBangs, pero 'long' no tiene que ser de 4 bytes (o incluso 32 bits) tampoco ... –

+1

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. –

2

Indica una cadena de caracteres anchos, del tipo wchar_t.

2

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";.

+0

No estoy seguro de por qué alguien le dio un voto negativo por esto. –

+0

Estaba confundido ya que el sufijo L en enteros lo convierte en largo. – shebaw

+0

@shebaw: Sí, pero en este caso ni siquiera es un sufijo. – AnT

5

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.