Advertencias constantes de múltiples caracteres

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

Código de muestra:

int waveHeader = 'EVAW'; 

¿Por qué esto da una advertencia?

De acuerdo con la norma (§6.4.4.4 / 10)

El valor de una constante de caracteres enteros que contiene más de un carácter (por ejemplo, ‘ab’), […] está definido por la implementación.

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

Esto es válido ISO 9899: 2011 C. Comstack sin previo aviso en gcc con -Wall , y una advertencia de “constante de carácter de varios caracteres” con -pedantic .

De la Wikipedia :

Las constantes de múltiples caracteres (por ejemplo, ‘xy’) son válidas, aunque raramente útiles: permiten almacenar varios caracteres en un entero (por ejemplo, 4 caracteres ASCII pueden caber en un entero de 32 bits, 8 en uno de 64 bits). Dado que no se especifica el orden en el que los caracteres se empaquetan en uno int, el uso portátil de constantes de múltiples caracteres es difícil.

Para fines de portabilidad, no use constantes de múltiples caracteres con tipos integrales.

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

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

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

 -Wno-multichar 

Lo uso para que mis propias aplicaciones funcionen con encabezados de archivos AVI y MP4 por razones similares.

Incluso si está dispuesto a buscar qué comportamiento define su implementación, las constantes de múltiples caracteres aún variarán con la endianidad.

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