uso reglas palabras letra ejemplos digrafos digrafo con c++ c digraphs trigraphs

c++ - palabras - reglas del uso de la ch



¿Los dígrafos y los trigrafos están en uso hoy en día? (5)

El uso de tri y di-gráficos no está escrito en este día, solo existe en un código muy antiguo que se creó en un entorno muy limitado. Cualquier código que contenga trigraphs, si intenta compilarlos en un compilador moderno como el de VS, generalmente no se compilará a menos que especifique una opción de enlazador. Sé que para Visual Studio, esa opción es "/ Zc: trigraphs"

Por qué existen, es porque el comité C ++ nunca emite cambios que podrían "romper" el código heredado. Para bien o para mal. Hay una anécdota de que su eliminación fue propuesta y admitida, y fue detenida por un único representante de IBM.

Dado que alguna vez hubo razones para usar dígrafos y trigrafos en C y C ++, ¿alguien los puso en el código que se escribe hoy? ¿Hay alguna cantidad sustancial de código heredado aún en mantenimiento que los contenga?

(Nota: Aquí, "dígrafo" no significa "gráfico dirigido". Tanto el digraph como el trigraph tienen múltiples significados, pero el uso previsto aquí son secuencias como ??= o <: para representar caracteres como # y [ )


Hay una propuesta pendiente para C ++ 1z (el próximo estándar después de C ++ 1y se estandarizará en -hoho con verosimilitud- C ++ 14) que tiene como objetivo eliminar los trigrafos del Estándar. Hicieron un estudio de caso en una gran base de código no divulgada:

Caso de estudio

Se examinaron los usos de construcciones similares a trigrafos en una gran base de código. Descubrimos:

923 instancias de un escapado? en una cadena literal para evitar el reemplazo de trigrafos: string pattern () const {return "foo - ???? /? - of - ?????"; }

4 instancias de trigrafos que se usan deliberadamente en el código de prueba: dos en el conjunto de pruebas para un compilador, los otros dos en un conjunto de pruebas para la biblioteca de preprocesadores de boost.

0 instancias de trigrafos que se usan deliberadamente en el código de producción. Los trigraphs continúan representando una carga para los usuarios de C ++.

Las notas de la propuesta (énfasis audaz de la propuesta original):

Si los trigrafos se eliminan por completo del lenguaje, una implementación que desee respaldarlos puede continuar haciéndolo: su mapeo definido por la implementación desde los caracteres del archivo fuente físico hasta el conjunto básico de caracteres fuente puede incluir la traducción trigraficada (e incluso puede evitar hacerlo dentro de literales crudos de cadena). No necesitamos trigrafos en el estándar de compatibilidad con versiones anteriores .


No estoy seguro, pero lo más probable es que encuentre dígrafos y trigrafos en entornos de mainframe de IBM. El EBCDIC caracteres EBCDIC no incluye algunos caracteres necesarios para C.

La otra justificación para los dígrafos y trigrafos, los juegos de caracteres ASCII-ish de 7 bits que reemplazan algunos caracteres de puntuación con letras acentuadas, es probablemente menos relevante en la actualidad.

Fuera de tales entornos, sospecho que los trigrafos son más comúnmente utilizados por error que deliberadamente, como en:

puts("What happened??!");

Como referencia, los trigrafos se introdujeron en el estándar ANSI C de 1989 (que esencialmente se convirtió en el estándar ISO C de 1990). Son:

??= # ??) ] ??! | ??( [ ??'' ^ ??> } ??/ / ??< { ??- ~

Los reemplazos ocurren en cualquier parte del código fuente, incluidos los comentarios y los literales de cadena.

Los digrafos son deletreos alternativos de ciertos tokens, y no afectan los comentarios o literales:

<: [ :> ] <% { %> } %: # %:%: ##

Los digrafos se introdujeron mediante la enmienda de 1995 al estándar ISO C de 1990.


Sé que esta es una vieja pregunta, pero podría decirse que es un uso legítimo en la actualidad: pantallas táctiles sin un teclado real. Por ejemplo, el diseño de teclado típico de los EE. UU. No está necesariamente disponible en su totalidad si realiza una codificación a través de una tableta o algo así, lo que sin duda es raro debido a lo engorroso que puede ser (tres clics en el mío para un operador de asignación) . Personalmente, no los uso si es posible, pero son útiles en ausencia de los tokens reales que deben representar.

De nuevo, realmente espero que las personas eviten esto siempre que sea posible, pero es una razón para conocerlos y usarlos.