C Language
Secuencia de caracteres de múltiples caracteres
Buscar..
Observaciones
No todos los preprocesadores admiten el procesamiento de secuencias trigráficas. Algunos compiladores dan una opción extra o un interruptor para procesarlos. Otros utilizan un programa separado para convertir trigraphs.
El compilador GCC no los reconoce a menos que usted lo solicite explícitamente (use -trigraphs
para habilitarlos; use -Wtrigraphs
, parte de -Wall
, para obtener advertencias sobre los trigraphs).
Como la mayoría de las plataformas en uso hoy en día son compatibles con la gama completa de caracteres únicos utilizados en C, se prefieren los dígrafos en lugar de los trigrafos, pero generalmente se desaconseja el uso de cualquier secuencia de caracteres de múltiples caracteres.
Además, tenga cuidado con el uso accidental del trígrafo (por ejemplo, puts("What happened??!!");
Trigrafos
Los símbolos [ ] { } ^ \ | ~ #
se utilizan con frecuencia en los programas de C, pero a fines de la década de 1980, hubo conjuntos de códigos en uso (variantes ISO 646, por ejemplo, en países escandinavos) donde las posiciones de caracteres ASCII para estos se usaron para caracteres de variantes de idiomas nacionales (por ejemplo, £
para #
en el Reino Unido; Æ Å æ å ø Ø
para { } { } | \
en Dinamarca; no había ~
en EBCDIC). Esto significaba que era difícil escribir código C en las máquinas que usaban estos conjuntos.
Para resolver este problema, el estándar C sugirió el uso de combinaciones de tres caracteres para producir un solo carácter llamado trigraph. Un trigraph es una secuencia de tres caracteres, los dos primeros de los cuales son signos de interrogación.
El siguiente es un ejemplo simple que usa secuencias trigráficas en lugar de #
, {
y }
:
??=include <stdio.h>
int main()
??<
printf("Hello World!\n");
??>
Esto lo cambiará el preprocesador de C reemplazando los trigrafos con sus equivalentes de un solo carácter como si el código hubiera sido escrito:
#include <stdio.h>
int main()
{
printf("Hello World!\n");
}
Trígrafo | Equivalente |
---|---|
?? = | # |
?? / | \ |
?? | ^ |
?? | El |
??) | ] |
?? | | |
?? < | { |
??> | } |
?? - | ~ |
Tenga en cuenta que los trigraphs son problemáticos porque, por ejemplo, ??/
es una barra invertida y puede afectar el significado de las líneas de continuación en los comentarios, y deben ser reconocidos dentro de cadenas y literales de caracteres (por ejemplo, '??/??/'
es una sola personaje, una barra invertida).
Digraphs
En 1994 se proporcionaron alternativas más legibles a cinco de los trigrafos. Estos utilizan solo dos caracteres y son conocidos como digraphs. A diferencia de los trigraphs, los digraphs son tokens. Si aparece un dígrafo en otro token (por ejemplo, literales de cadenas o constantes de caracteres), no se tratará como un dígrafo, sino que permanecerá como está.
A continuación se muestra la diferencia antes y después de procesar la secuencia de dígrafos.
#include <stdio.h>
int main()
<%
printf("Hello %> World!\n"); /* Note that the string contains a digraph */
%>
Que será tratado igual que:
#include <stdio.h>
int main()
{
printf("Hello %> World!\n"); /* Note the unchanged digraph within the string. */
}
Dígrafo | Equivalente |
---|---|
<: | El |
:> | ] |
<% | { |
%> | } |
%: | # |