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