¿Es '\ u0B95' un literal de múltiples caracteres?
Enuna respuesta anterior que di, Respondí a la siguiente advertencia causada por el hecho de que'\u0B95'
requiere tres bytes y por lo tanto es unaliteral de varios caracteres:
warning: multi-character character constant [-Wmultichar]
Pero en realidad, no creo que tenga razón y tampoco creo que gcc lo esté. Los estados estándar:
Un literal de carácter ordinario que contiene más de uno.c-char es unliteral de varios caracteres.
Una regla de producción parac-char es unnombre de carácter universal (es decir.\uXXXX
o\UXXXXXXXX
). Ya que\u0B95
es un singlec-char, este no es un literal de varios caracteres. Pero ahora se ensucia. El estándar también dice:
Un literal de carácter ordinario que contiene un soloc-char tiene tipochar
, con valor igual al valor numérico de la codificación de lac-char en el conjunto de caracteres de ejecución.
Así que mi literal tiene tipochar
y el valor del carácter en el conjunto de caracteres de ejecución (o el valor definido por la implementación si no existe en ese conjunto).char
solo se define como lo suficientemente grande para almacenar cualquier miembro del conjunto de caracteres básico (que en realidad no está definido por el estándar, pero supongo que significa el conjunto de caracteres de ejecución básico):
Los objetos declarados como caracteres (caracteres) deben ser lo suficientemente grandes como para almacenar cualquier miembro del conjunto de caracteres básico de la implementación.
Por lo tanto, dado que el conjunto de caracteres de ejecución es un superconjunto de todos los valores achar
puede sostener, mi personaje no puede caber en elchar
.
Entonces, ¿qué valorhace michar
¿tener? Esto no parece estar definido en ninguna parte. La norma dice que parachar16_t
literales, si el valor no es representable, el programa está mal formado. Sin embargo, no dice nada sobre los literales ordinarios.
Entonces, ¿qué está pasando? ¿Esto es solo un desastre en el estándar o me estoy perdiendo algo?