¿Por qué existen literales de varios caracteres en C y C++?
No sabía que C y C++ permiten multicharacter literal
: no 'c' (de tipo int en C y char en C++), sino 'tralivali' (¡de tipo int !)
enum
{
ActionLeft = 'left',
ActionRight = 'right',
ActionForward = 'forward',
ActionBackward = 'backward'
};
Estándar dice:
C99 6.4.4.4p10: "El valor de una constante de carácter entero que contiene más de un carácter (por ejemplo, 'ab'), o que contiene un carácter o secuencia de escape que no se asigna a un carácter de ejecución de un solo byte, está definido por la implementación ".
Descubrí que se utilizan ampliamente en el motor C4 . Pero supongo que no son seguros cuando hablamos de serialización independiente de la plataforma. También pueden resultar confusos porque parecen hilos. Entonces, ¿cuál es el alcance de uso de los literales de varios caracteres? ¿Son útiles para algo? ¿Están en C++ solo por compatibilidad con el código C? ¿Se consideran una mala característica como operador Goto o no?
Hace que sea más fácil seleccionar valores en un volcado de memoria.
Ejemplo:
enum state { waiting, running, stopped };
vs.
enum state { waiting = 'wait', running = 'run.', stopped = 'stop' };
un volcado de memoria después de la siguiente declaración:
s = stopped;
podría verse así:
00 00 00 02 . . . .
en el primer caso, vs:
73 74 6F 70 s t o p
utilizando literales de varios caracteres. (por supuesto, si dice "detener" o "pots" depende del orden de los bytes)
No sé hasta qué punto se utiliza esto, pero "definido por la implementación" es una gran señal de alerta para mí. Hasta donde yo sé, esto podría significar que la implementación podría optar por ignorar las designaciones de caracteres y simplemente asignar valores incrementales normales si así lo desea. Puede hacer algo "mejor", pero no puede confiar en ese comportamiento entre compiladores (o incluso entre versiones de compilador). Al menos "goto" tiene un comportamiento predecible (aunque indeseable)...
Ese es mi 2c, de todos modos.
Editar: en "definido por implementación":
Del glosario de C++ de Bjarne Stroustrup :
implementación definida : un aspecto de la semántica de C++ que se define para cada implementación en lugar de especificarse en el estándar para cada implementación. Un ejemplo es el tamaño de un int (que debe tener al menos 16 bits pero puede ser más largo). Evite implementar comportamientos definidos siempre que sea posible. Ver también: indefinido. CT++PL C.2.
también...
indefinido : un aspecto de la semántica de C++ para el cual no se requiere ningún comportamiento razonable. Un ejemplo es eliminar la referencia a un puntero con el valor cero. Evite el comportamiento indefinido. Ver también: implementación definida. CT++PL C.2.
Creo que esto significa que el comentario es correcto: al menos debería compilarse, aunque no se especifica nada más allá de eso. Tenga en cuenta también los consejos de la definición.
Cuatro caracteres literales que he visto y usado. Se asignan a 4 bytes = una palabra de 32 bits. Es muy útil para fines de depuración como se dijo anteriormente. Se pueden usar en una declaración switch/case con enteros, lo cual es bueno.
Esto (4 caracteres) es bastante estándar (es decir, es compatible al menos con GCC y VC++), aunque los resultados (valores reales compilados) pueden variar de una implementación a otra.
¿Pero más de 4 caracteres? Yo no lo usaría.
ACTUALIZACIÓN: Desde la página C4: "Para nuestras acciones simples, simplemente proporcionaremos una enumeración de algunos valores, lo cual se realiza en C4 especificando constantes de cuatro caracteres". Entonces están usando literales de 4 caracteres, como fue mi caso.