C Language
Sequenza di caratteri multi-carattere
Ricerca…
Osservazioni
Non tutti i preprocessori supportano l'elaborazione della sequenza trigraph. Alcuni compilatori offrono un'opzione o un passaggio aggiuntivo per elaborarli. Altri usano un programma separato per convertire i trigraph.
Il compilatore GCC non li riconosce a meno che tu non lo richieda esplicitamente di farlo (usa -trigraphs
per abilitarli; usa -Wtrigraphs
, parte di -Wall
, per ricevere avvisi sui trigraphs).
Poiché la maggior parte delle piattaforme in uso oggi supporta l'intera gamma di caratteri singoli utilizzati in C, i digrafi sono preferiti rispetto ai trigrafi, ma l'uso di sequenze di caratteri multi-carattere è generalmente scoraggiato.
Inoltre, fai attenzione all'uso accidentale del trigrafo ( puts("What happened??!!");
ad esempio).
trigraph
I simboli [ ] { } ^ \ | ~ #
Sono spesso utilizzati nei programmi C, ma alla fine del 1980, ci sono stati set di codici in uso (ISO 646 varianti, per esempio, nei paesi scandinavi), dove le posizioni dei caratteri ASCII per questi sono stati utilizzati per i caratteri variante linguistica nazionale (ad esempio £
per #
nel Regno Unito; Æ Å æ å ø Ø
per { } { } | \
in Danimarca; non ci sono stati ~
in EBCDIC). Ciò significava che era difficile scrivere codice C su macchine che usavano questi set.
Per risolvere questo problema, lo standard C suggeriva l'uso di combinazioni di tre caratteri per produrre un singolo carattere chiamato trigramma. Un trigramma è una sequenza di tre caratteri, i primi due dei quali sono punti interrogativi.
Quello che segue è un semplice esempio che usa sequenze trigraph invece di #
, {
e }
:
??=include <stdio.h>
int main()
??<
printf("Hello World!\n");
??>
Questo verrà modificato dal preprocessore C sostituendo i trigrafi con i loro equivalenti a carattere singolo come se il codice fosse stato scritto:
#include <stdio.h>
int main()
{
printf("Hello World!\n");
}
trigraph | Equivalente |
---|---|
?? = | # |
?? / | \ |
??' | ^ |
?? ( | [ |
??) | ] |
??! | | |
?? < | { |
??> | } |
?? - | ~ |
Si noti che i trigraph sono problematici perché, ad esempio, ??/
è una barra retroversa e può influenzare il significato delle linee di continuazione nei commenti e deve essere riconosciuto all'interno di stringhe e caratteri letterali (ad esempio '??/??/'
è un singolo carattere, una barra rovesciata).
digrafi
Nel 1994 furono fornite alternative più leggibili a cinque dei trigrafi. Questi usano solo due caratteri e sono conosciuti come digrafi. A differenza dei trigrafi, i digrafi sono token. Se un digraph si verifica in un altro token (ad es. Stringhe letterali o costanti di caratteri), non verrà trattato come un digrafo, ma rimarrà così com'è.
Quanto segue mostra la differenza prima e dopo l'elaborazione della sequenza di digrammi.
#include <stdio.h>
int main()
<%
printf("Hello %> World!\n"); /* Note that the string contains a digraph */
%>
Che sarà trattato come:
#include <stdio.h>
int main()
{
printf("Hello %> World!\n"); /* Note the unchanged digraph within the string. */
}
digramma | Equivalente |
---|---|
<: | [ |
:> | ] |
<% | { |
%> | } |
%: | # |