C Language
Séquence de caractères multi-caractères
Recherche…
Remarques
Tous les préprocesseurs ne prennent pas en charge le traitement des séquences de trigraphes. Certains compilateurs donnent une option ou un commutateur supplémentaire pour les traiter. D'autres utilisent un programme séparé pour convertir les trigraphes.
Le compilateur GCC ne les reconnaît pas à moins que vous ne le -trigraphs
explicitement (utilisez -trigraphs
pour les activer, utilisez -Wtrigraphs
, une partie de -Wall
, pour obtenir des avertissements sur les trigraphes).
Comme la plupart des plates-formes utilisées aujourd'hui prennent en charge la totalité des caractères uniques utilisés en C, les digraphes sont préférés aux trigraphes, mais l'utilisation de séquences de caractères multi-caractères est généralement déconseillée.
Aussi, méfiez-vous de l'utilisation accidentelle de trigraphes ( puts("What happened??!!");
, par exemple).
Trigraphes
Les symboles [ ] { } ^ \ | ~ #
Sont fréquemment utilisés dans les programmes C, mais dans les fin des années 1980, il y avait des jeux de codes utilisés (variantes ISO 646, par exemple, dans les pays scandinaves) où les positions de caractères ASCII pour ceux - ci ont été utilisés pour les variantes de caractères langue nationale (par exemple £
pour #
au Royaume - Uni, Æ Å æ å ø Ø
pour { } { } | \
au Danemark, il n'y avait pas ~
en EBCDIC). Cela signifiait qu'il était difficile d'écrire du code C sur les machines qui utilisaient ces ensembles.
Pour résoudre ce problème, le standard C a suggéré d'utiliser des combinaisons de trois caractères pour produire un seul caractère appelé trigraphe. Un trigraphe est une séquence de trois caractères, dont les deux premiers sont des points d'interrogation.
Voici un exemple simple qui utilise des séquences de trigraphes au lieu de #
, {
et }
:
??=include <stdio.h>
int main()
??<
printf("Hello World!\n");
??>
Cela sera modifié par le préprocesseur C en remplaçant les trigraphes par leurs équivalents à caractère unique comme si le code avait été écrit:
#include <stdio.h>
int main()
{
printf("Hello World!\n");
}
Trigraph | Équivalent |
---|---|
?? = | # |
?? / | \ |
?? ' | ^ |
?? ( | [ |
??) | ] |
??! | | |
?? < | { |
??> | } |
?? - | ~ |
Notez que les trigraphes sont problématiques car, par exemple, ??/
est une barre oblique inverse et peut affecter la signification des lignes de continuation dans les commentaires, et doivent être reconnus dans les chaînes et les caractères littéraux (par exemple, '??/??/'
est un simple) caractère, une barre oblique inverse).
Digraphes
En 1994, des alternatives plus lisibles à cinq des trigraphes ont été fournies. Ceux-ci n'utilisent que deux caractères et sont appelés digraphs. Contrairement aux trigraphes, les digraphes sont des jetons. Si un digraphe apparaît dans un autre jeton (littéraux de chaîne ou constantes de caractères, par exemple), il ne sera pas traité comme un digraphe, mais restera tel quel.
Ce qui suit montre la différence avant et après le traitement de la séquence de digraphes.
#include <stdio.h>
int main()
<%
printf("Hello %> World!\n"); /* Note that the string contains a digraph */
%>
Qui sera traité de la même façon que:
#include <stdio.h>
int main()
{
printf("Hello %> World!\n"); /* Note the unchanged digraph within the string. */
}
Digraph | Équivalent |
---|---|
<: | [ |
:> | ] |
<% | { |
%> | } |
%: | # |