2011-10-13 10 views
24

¿Por qué es esto una advertencia? Creo que hay muchos casos en los que es más claro usar constantes int multi-char en lugar de números "sin significado" o en lugar de definir variables const con el mismo valor. Al analizar tipos de archivos de onda/tiff/otros, es más claro comparar los valores de lectura con algunos 'EVAW', 'datos', etc. en lugar de sus valores correspondientes.Advertencias constantes de varios caracteres

Código de ejemplo:

int waveHeader = 'EVAW'; 

¿Por qué esto da una advertencia?

+0

Tengo problemas para tratar de entender su pregunta. ¿Puedes hacerlo más claro? –

+0

@ 0A0D Lo intentaré :) Lo siento – Felics

+0

Relacionado: http: // stackoverflow.com/questions/7497192/enum-constants-questions –

Respuesta

28

According to the standard (§6.4.4.4/10)

El valor de una constante de carácter entero que contiene más de un carácter (por ejemplo, 'ab'), [...] es definido por la implementación.

long x = '\xde\xad\xbe\xef'; // yes, single quotes 

Ésta es válida la norma ISO 9899: 2011 C. Se compila sin previo aviso bajo gcc con -Wall, y un “carácter multi-carácter constante” advertencia con -pedantic.

De Wikipedia:

constantes de varios caracteres (por ejemplo, 'xy') son válidos, aunque rara vez útiles - una tienda de varios personajes que permiten en un entero (por ejemplo, 4 caracteres ASCII pueden caber en una Entero de 32 bits, 8 en uno de 64 bits). Dado que el orden en el que los caracteres están empaquetados en uno int no es especificado, el uso portátil de constantes de múltiples caracteres es difícil.

Para fines de portabilidad, no utilice constantes de varios caracteres con tipos integrales.

+3

No estoy seguro de qué significa la última frase; Las constantes de múltiples caracteres siempre tienen tipos integrales (y tales constantes sin un prefijo siempre tienen el tipo 'int'). –

12

Esta advertencia es útil para los programadores que escribirían erróneamente 'test' donde deberían haber escrito "test".

Esto ocurre mucho más a menudo que los programadores que realmente quieren constantes int multi-char.

+2

Este es un buen ejemplo, pero ¿qué sucede cuando realmente quiero escribir 'prueba' y tengo una advertencia. No dejo advertencias en mi código ... – Felics

+0

Tienes que lidiar con la advertencia o encontrar tu opción de compilador para desactivar esta advertencia específica (que puede hacerte daño en otro lugar de tu código ;-)). –

+1

Otro error accidental del programador es recordar mal la sintaxis de escapes hexadecimales y escribir '\ 0x61' cuando uno significa '\ x61'. – tml

11

Si estás contento de saber lo que está haciendo y puede aceptar los problemas de portabilidad, el CCG por ejemplo, puede desactivar la advertencia en la línea de comandos:

-Wno-multichar 

lo uso para mi propia aplicaciones para trabajar con encabezados de archivos AVI y MP4 por razones similares para usted.

3

Incluso si está dispuesto a buscar qué comportamiento define su implementación, las constantes de varios caracteres todavía varían con la permanencia.

Es mejor usar una estructura (POD) {char [4]}; ... y luego use un UDL como "WAVE" _4cc para construir fácilmente instancias de esa clase

Cuestiones relacionadas