Trígrafo (lenguajes C)

La versión actual de la página aún no ha sido revisada por colaboradores experimentados y puede diferir significativamente de la versión revisada el 28 de febrero de 2021; las comprobaciones requieren 2 ediciones .

Un trigraph (en la familia de idiomas C ) ( eng.  trigraph ) es una secuencia de tres caracteres, los dos primeros de los cuales son signos de interrogación (" ??"), y el tercero indica el significado del trigraph. Los trígrafos son procesados ​​por el preprocesador C/C++ .

Tabla de trígrafos

trigrafo símbolo equivalente
??= #
??/ \
??' ^
??( [
??) ]
??! |
??< {
??> }
??- ~

La combinación de tres signos de interrogación (" ???") no es un trigrafo.

En realidad, los trigrafos prácticamente no se utilizan. Algunos compiladores (como gcc ) incluso emiten una advertencia cuando manejan trigraphs.

Historia

El motivo de la aparición de los trígrafos es que la página de códigos de siete bits ISO/IEC 646 , adoptada en 1972 y basada en ASCII , asignaba posiciones de carácter " #$@[\]^`{|}~" a caracteres nacionales ( letras suplementarias y símbolos de moneda ). { a[i]='\n'; }Por ejemplo, los alemanes podían ver el código como ä aÄiÜ='Ön'; ü. Para reemplazar los corchetes faltantes, se introdujeron trigraphs.

En Pascal , los dígrafos se usan con el mismo propósito : (. .) (* *)en lugar de [] {}.

Los trígrafos han quedado obsoletos en el estándar C++17 [1] [2] .

Ejemplos de comportamiento inesperado

Los siguientes son ejemplos del uso del trígrafo “ ??/” reemplazado por el símbolo “ \”. El \carácter " " es un carácter de escape para el carácter de nueva línea .

// ¿Se ejecutará la siguiente línea????????????????/ a ++ ;

Después de reemplazar " ??/" con " \", el código a++;de la segunda línea se considerará una continuación del comentario que comenzó en la primera línea.

/??/ * Un comentario *??/ /

Después de reemplazar “ ??/” con “ \”, el código especificado será equivalente al código

/* Un comentario */

Ejemplo de programa

??= incluir < stdio . h > /* # */ int principal ( vacío ) ??< /* { */ charn ?? _ ( 5 ?? ); /* [ y ] */ n ?? ( 4 ?? ) = '0' - ( ?? -0 ?? ' 1 ??! 2 ); /* ~, ^ y | */ printf ( "%c??/n" , n ?? ( 4 ?? )); /* ??/ = \ */ devolver 0 ; ??>

Véase también

Notas

  1. " ¡¿¿ Quitando trigrafos??! Archivado el 9 de julio de 2018 en Wayback Machine ”, N3981, Richard Smith, 2014-05-06; [1] Archivado el 8 de septiembre de 2017 en Wayback Machine .
  2. OpenNews: Aprobado el estándar C++17 . opennet.ru Consultado el 7 de septiembre de 2017. Archivado desde el original el 8 de septiembre de 2017.