¿Cuál es el uso de nombres de caracteres universales en identificadores en C ++

11

El C ++ estándar (me di cuenta de que en la nueva, pero ya existía en C ++ 03) especifica los nombres de personajes universales, escrito como \uNNNNy \UNNNNNNNNy representación de los personajes con puntos de código Unicode NNNN/ NNNNNNNN. Esto es útil con los literales de cadena, especialmente porque también se definen explícitamente los literales de cadena UTF-8, UTF-16 y UCS-4. Sin embargo, los literales de caracteres universales también están permitidos en los identificadores. ¿Cuál es la motivación detrás de eso?

La sintaxis es obviamente totalmente ilegible, los identificadores pueden estar maltratados para el enlazador y no es como si hubiera una función estándar para recuperar símbolos por nombre de todos modos. Entonces, ¿por qué alguien usaría un identificador con literales de caracteres universales?

Editar: Dado que ya existía en C ++ 03, una pregunta adicional sería si realmente vio un código que lo usó.

Jan Hudec
fuente

Respuestas:

6

ACTUALIZACIÓN : esta respuesta, aunque parecía tener sentido para mí y para los demás, resulta ser en gran medida errónea (y suficientemente errónea con respecto a la intención, como para ser efectivamente simplemente errónea). Puesto que (como en punta a cabo en un comentario por AProgrammer) que está no permite el uso de UCS exterior de las constantes de cadena cuando el mismo carácter puede ser representado normalmente en el juego de caracteres de base. Entonces, no usarlo para escapar de palabras clave, como en mi ejemplo; y no usarlo para hacer 'identificadores' como 23skiddoescapando del2. Supongo que aún podría usarse para hacer que los nombres sean compatibles con idiomas externos, pero solo parece que cuando esos nombres comienzan con una letra o un carácter extendido, y contienen solo letras, dígitos, subrayado y caracteres extendidos, que parece demasiado restrictivo para apoyar adecuadamente esa intención. Por lo tanto, debe ser que la intención principal es (como en la respuesta de AProgrammer) permitir estos caracteres adicionales en los identificadores, y permitir a los editores de origen donde estos caracteres se muestran gráficamente, al tiempo que permite que el archivo de origen esté en ASCII simple.


Los programas C ++ pueden llamar a funciones escritas en otros lenguajes. Es una buena estrategia por parte del comité de estandarización asegurarse de que C ++ sea interoperable con otros lenguajes que pueden permitir caracteres no alfanuméricos o unicode en los nombres de funciones, incluso si dichos lenguajes aún no existen. El estándar no necesita especificar cómo funcionará esto a nivel de enlazador, etc; pero es bueno tener un mecanismo específico para permitirlo.

No necesita mirar hacia el futuro para ver un uso para esto. Supongamos que tengo una antigua biblioteca de C con una función llamada catch(o protegida, o mutable) ... y quiero llamarla desde C ++. Y por alguna razón, no puedo o no quiero modificar el código C (Por cierto, más de una vez tuve que lidiar con el código C antiguo que usaba un nombre de función que se había convertido en una palabra clave C ++ ...)

Con los nombres UC, puedo escribir esto en un encabezado y luego simplemente llamar 'catch_func ()':

extern "C" {
       int catc\u0068( int a, int b );  // C 'catch()' function
}
inline int catch_func( int a, int b ) { return catc\u0068(a,b); }

Claro que es feo, pero no importa ya que solo está en un lugar en el encabezado. El mismo enfoque se podría usar para hacer stubs para llamar a funciones en otros lenguajes, y funciona incluso si los nombres son palabras clave de C ++ o unicode, o tienen espacios .u otros signos de puntuación incrustados en ellos

Varios otros idiomas tienen dispositivos que permiten la creación de identificadores que no siguen el patrón general; por ejemplo, en Verilog, \abcdes un identificador equivalente a abcd, pero \whiley \23skidooy también \44.e2son identificadores, que necesitan que el prefijo de barra diagonal inversa se vea como tal. Debido a la forma en que se usa Verilog, es importante permitir cualquier nombre, en lo que respecta a las interfaces externas.

Greggo
fuente
Interesante caso de uso. Aunque sospecho (cuando sea posible) sería mejor escribir un pequeño archivo C para traducir el nombre (y, por lo tanto, puede usar el identificador C ++) y hacer que C ++ llame a esa función C.
Thomas Eding
1
No puede escribir eso por dos razones, el primer UCS fuera de la cadena y los literales de caracteres no pueden referirse al carácter en los conjuntos básicos sin hacer que el programa esté mal formado, en segundo lugar si esa cláusula no estaba presente, los UCS se manejan en la fase 1 de la traducción y por lo tanto, no habría diferencia en el manejo entre un UCS que se refiere a un carácter en el conjunto básico y el propio carácter.
Programador
4

Permite un sistema que permite que los caracteres unicode en el identificador exporten la fuente en un formato que se pueda compilar en cualquier compilador estándar. Es decir, es una forma de codificar unicode sobre el conjunto de caracteres básico (más o menos como imprimible entre comillas se usa para correo electrónico, los sistemas que saben mejor pueden hacer un mejor trabajo, otros sistemas aún funcionan).

Un programador
fuente
2

Alguien puede querer crear un identificador usando un carácter de idioma extranjero que no se pueda ingresar en el teclado o dispositivo de entrada. Alternativamente, el identificador puede contener un carácter que no se puede imprimir utilizando la fuente o las capacidades de salida del dispositivo, pero el IDE desea mostrar una representación precisa.

akton
fuente
44
En el primer caso, el identificador no parecería tener ese carácter, por lo que el código sería ilegible y el identificador realmente no es importante para la máquina. Y para el segundo, la representación en IDE es un problema completamente separado.
Jan Hudec
1

C ++ requiere que los caracteres extendidos reales que aparecen literalmente en la fuente se comporten de manera idéntica con los nombres de caracteres universales. Al permitir nombres de caracteres universales en los identificadores, los programadores pueden usar caracteres extendidos en los identificadores.

bames53
fuente
Si los caracteres extendidos reales son compatibles, deben comportarse como caracteres universales correspondientes. Pero no tienen que ser compatibles.
Jan Hudec
1
Eso es cierto, pero de alguna manera pierde el punto, que es que si el comité quiere especificar que las implementaciones que admiten caracteres extendidos deberían admitir el uso de esos caracteres en los identificadores, entonces eso requiere que se permitan UCN en los identificadores. Es decir, los UCN están permitidos en los identificadores, no necesariamente porque sea tan legible y a todos les encanta codificar manualmente los nombres en hexadecimal, sino porque si la especificación quiere permitir que se usen caracteres extendidos en los identificadores, entonces lo hace especificando que los UCN están permitidos en los identificadores.
bames53