¿Propósito de las secuencias Trigraph en C++?

¿Propósito de las secuencias Trigraph en C++?

Esta pregunta (sobre los dígrafos estrechamente relacionados) tiene la respuesta.

Todo se reduce al hecho de que el conjunto de caracteres ISO 646 no tiene todos los caracteres de la sintaxis C, por lo que hay algunos sistemas con teclados y pantallas que no pueden manejar los caracteres (aunque me imagino que estos son bastante raros hoy en día).

En general, no necesita usarlos, pero necesita conocerlos exactamente para el problema que encontró. Los trígrafos son la razón por la que el '? ' carácter tiene una secuencia de escape:

'\?'

Entonces, un par de formas en que puede evitar su problema de ejemplo son:

 printf( "What?\?!\n" ); 

 printf( "What?" "?!\n" ); 

Pero tienes que recordar cuando estás escribiendo los dos '?' caracteres en los que podrías estar comenzando un trígrafo (y ciertamente nunca es algo en lo que esté pensando).

En la práctica, los trígrafos y los dígrafos son algo que no me preocupa en absoluto en el día a día. Pero debe estar al tanto de ellos porque una vez cada dos años se encontrará con un error relacionado con ellos (y pasará el resto del día maldiciendo su existencia). Sería bueno si los compiladores pudieran configurarse para advertir (o generar un error) cuando se encuentran con un trígrafo o un dígrafo, para poder saber que tengo algo con lo que debo tratar a sabiendas.

Y solo para completar, los dígrafos son mucho menos peligrosos ya que se procesan como tokens, por lo que un dígrafo dentro de una cadena literal no se interpretará como un dígrafo.

Para obtener una buena educación sobre la diversión con la puntuación en los programas C/C++ (incluido un error de trigraph que definitivamente me haría tirarme de los pelos), eche un vistazo al artículo GOTW #86 de Herb Sutter.

Anexo:

Parece que GCC no procesará (y advertirá sobre) trigraphs por defecto. Algunos otros compiladores tienen opciones para desactivar el soporte de trigraph (IBM, por ejemplo). Microsoft comenzó a admitir una advertencia (C4837) en VS2008 que debe habilitarse explícitamente (usando -Wall o algo así).


¡Niños de hoy! :-)

Sí, equipo extranjero, como una terminal IBM 3270. El 3270 tiene, si mal no recuerdo, ¡no tiene llaves! Si quería escribir C en un mini/mainframe de IBM, tenía que usa los miserables trigraphs para cada límite de bloque. Afortunadamente, solo tuve que escribir software en C para emular algunas instalaciones de minicomputadoras de IBM, en realidad no escriben software C en el Sistema/36.

Mire al lado de la tecla "P":

Mmm. Difícil de decir. Hay un botón adicional al lado de "retorno de carro", y podría tenerlo al revés:tal vez era el par "[" / "]" que faltaba. En cualquier caso, este teclado le causaría molestias si tuviera que escribir C.

Además, estos terminales muestran EBCDIC, el juego de caracteres de mainframe "nativo" de IBM, no ASCII (gracias, Pavel Minaev, por el recordatorio).

Por otro lado, como dice la guía GNU C:"No necesitas este daño cerebral". El compilador gcc deja esta "característica" deshabilitada de manera predeterminada.


Desde The C++ Programming Language Edición especial, página 829