Advertencias constantes de varios 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. Cuando el análisis de wave / tiff / otros tipos de archivos es más claro para comparar los valores de lectura con algunos 'EVAW', 'data', etc en lugar de sus valores correspondientes.

Código de ejemplo:

int waveHeader = 'EVAW';

¿Por qué esto da una advertencia?

Author: Lundin, 2011-10-13

4 answers

Según el estándar (§6.4.4.4/10)

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

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

Esto es válido ISO 9899:2011 C. Compila sin previo aviso bajo gcc con -Wall, y una advertencia de "constante de caracteres de varios caracteres" con -pedantic.

De Wikipedia:

Las constantes de varios caracteres (por ejemplo, 'xy') son válidas, aunque rara vez útil-permiten almacenar varios caracteres en un entero (por ejemplo, 4 Los caracteres ASCII pueden caber en un entero de 32 bits, 8 en un entero de 64 bits). Dado que el orden en el que se empaquetan los caracteres en un int no es el uso portátil y especificado de constantes de varios caracteres es difícil.

Por el bien de la portabilidad, no utilice constantes de varios caracteres con tipos integrales.

 32
Author: Lundin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-12-12 15:36:41

Esta advertencia es útil para programadores que escribirían por error 'test' donde deberían haber escrito "test".

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

 14
Author: Didier Trosset,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-10-13 13:57:10

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 comandos:

-Wno-multichar

Uso esto para mis propias aplicaciones para trabajar con encabezados de archivos AVI y MP4 por razones similares a usted.

 11
Author: blueshift,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-01-13 03:58:29

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

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

 3
Author: o11c,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-05-25 04:45:45