Selon la norme C ++ '03 2.3 / 1:
Avant tout autre traitement, chaque occurrence de l'une des séquences suivantes de trois caractères («séquences de trigraphes») est remplacée par le caractère unique indiqué dans le tableau 1.
---------------------------------------------------------------------------- | trigraph | replacement | trigraph | replacement | trigraph | replacement | ---------------------------------------------------------------------------- | ??= | # | ??( | [ | ??< | { | | ??/ | \ | ??) | ] | ??> | } | | ??’ | ˆ | ??! | | | ??- | ˜ | ----------------------------------------------------------------------------
Dans la vraie vie, cela signifie que le code printf( "What??!\n" );
entraînera une impression What|
car ??!
c'est une séquence de trigraphe qui est remplacée par le |
caractère.
Ma question est à quoi sert les trigraphes? Y a-t-il un avantage pratique à utiliser les trigraphes?
UPD : Dans les réponses, il a été mentionné que certains claviers européens n'ont pas tous les caractères de ponctuation, donc les programmeurs non américains doivent utiliser des trigraphes dans la vie quotidienne?
UPD2 : Visual Studio 2010 a la prise en charge des trigraphes désactivée par défaut.
Réponses:
Cette question (sur les digraphes étroitement liés) a la réponse.
Cela se résume au fait que le jeu de caractères ISO 646 ne contient pas tous les caractères de la syntaxe C, il existe donc des systèmes avec des claviers et des écrans qui ne peuvent pas gérer les caractères (même si j'imagine que ceux-ci sont assez rares aujourd'hui).
En général, vous n'avez pas besoin de les utiliser, mais vous devez les connaître pour exactement le problème que vous avez rencontré. Les trigraphes sont la raison pour laquelle le
?
caractère « » a une séquence d'échappement:Vous pouvez donc éviter votre exemple de problème de deux manières:
Mais vous devez vous souvenir lorsque vous tapez les deux "?" caractères auxquels vous pourriez commencer un trigraphe (et ce n'est certainement jamais quelque chose auquel je pense).
En pratique, les trigraphes et les digraphes sont quelque chose qui ne me préoccupe pas du tout au quotidien. Mais vous devez en être conscient car une fois tous les deux ans, vous rencontrerez un bug qui leur est lié (et vous passerez le reste de la journée à maudire leur existence). Ce serait bien si les compilateurs pouvaient être configurés pour avertir (ou faire une erreur) quand il tombe sur un trigraphe ou un digraphe, afin que je puisse savoir que j'ai quelque chose que je devrais traiter sciemment.
Et juste pour être complet, les digraphes sont beaucoup moins dangereux car ils sont traités comme des jetons, donc un digraphe à l'intérieur d'une chaîne littérale ne sera pas interprété comme un digraphe.
Pour une bonne éducation sur divers amusements avec la ponctuation dans les programmes C / C ++ (y compris un bogue de trigraphe qui me ferait définitivement arracher les cheveux), jetez un œil à l'article GOTW # 86 de Herb Sutter .
Addenda:
Il semble que GCC ne traitera pas (et en avertira) les trigraphes par défaut. Certains autres compilateurs ont des options pour désactiver la prise en charge des trigraphes (IBM par exemple). Microsoft a commencé à prendre en charge un avertissement (C4837) dans VS2008 qui doit être explicitement activé (en utilisant -Wall ou quelque chose).
la source
Les enfants aujourd'hui! :-)
Oui, équipement étranger, tel qu'un terminal IBM 3270. Le 3270 n'a, si je me souviens, pas de bretelles! Si vous vouliez écrire C sur un IBM mini / mainframe, vous deviez utiliser les trigraphes misérables pour chaque limite de bloc. Heureusement, je n'ai eu qu'à écrire des logiciels en C pour émuler certaines installations de mini-ordinateurs IBM, pas vraiment d'écrire des logiciels C sur le System / 36.
Regardez à côté de la touche "P":
Hmmm. Dur à dire. Il y a un bouton supplémentaire à côté de "retour chariot", et je pourrais l'avoir à l'envers: c'était peut-être la paire "[" / "]" qui manquait. En tout cas, ce clavier vous causerait du chagrin si vous deviez écrire C.
De plus, ces terminaux affichent EBCDIC, le jeu de caractères mainframe "natif" d'IBM, et non ASCII (merci, Pavel Minaev, pour le rappel).
D'un autre côté, comme le dit le guide GNU C: "Vous n'avez pas besoin de ces lésions cérébrales." Le compilateur gcc laisse cette "fonctionnalité" désactivée par défaut.
la source
À partir de
The C++ Programming Language
l'édition spéciale, page 829la source
`
, qui manque à l'italien et à plusieurs autres dispositions de clavierIls sont destinés à être utilisés sur des systèmes qui ne contiennent pas certains des caractères du jeu de caractères de base de C ++. Il va sans dire que de tels systèmes sont extrêmement rares.
la source
Les trigraphes ont été proposés pour la suppression dans C ++ 0x. Cela dit, il semble y avoir encore de solides arguments pour les soutenir - voir le document du comité C ++ N2910 qui en discute. Apparemment, EBCDIC est un bastion majeur où ils sont nécessaires.
la source
J'ai vu des trigraphes utilisés au début des années 90 pour aider à convertir des programmes PL / 1 d'un mainframe à exécuter / compiler / déboguer sur un PC.
Ils essayaient de modifier PL / I sur le PC en utilisant un compilateur PL / I vers C et ils voulaient que le code fonctionne une fois déplacé vers le mainframe qui ne supportait pas les accolades. J'ai suggéré qu'ils pourraient utiliser des macros comme
ou comme alternative PL / I plus conviviale
et s'ils voulaient vraiment avoir de la fantaisie, ils pourraient essayer
et alors le programme aurait l'air d'avoir été écrit en Pascal. Ils m'ont juste regardé bizarrement et n'ont pas voulu me parler pour le reste de la journée. Je ne pense pas que je les blâme. :)
Ce qui a tué l'effort et non les tri-graphes, ce sont les différences de système IO entre les plates-formes. L'ouverture de fichiers sur le PC était tellement différente de celle du mainframe qu'elle aurait introduit beaucoup trop de kludges pour que le même code fonctionne sur les deux.
la source
Principalement parce que le standard C les a introduits en 1989, quand il y avait des problèmes avec la présence des caractères auxquels les trigraphes mappaient sur certaines machines. Au moment où la norme C ++ a été publiée en 1998, le besoin de trigraphes n'était pas grand. Ils sont une verrue sur C; ils sont tout autant une verrue sur C ++. Il y avait un besoin pour eux - surtout en dehors du monde anglophone - c'est pourquoi ils ont été ajoutés à C.
la source
Certains claviers européens n'ont pas (n'a pas?) Tous les caractères de ponctuation que les claviers américains avaient, car ils avaient besoin des touches pour leurs caractères alphabétiques inhabituels. Ainsi, par exemple (en créant cela), le clavier suédois aurait un anneau en A là où se trouvait l'accolade.
Pour s'adapter à ces utilisateurs, les trigraphes sont un moyen de saisir la ponctuation en utilisant uniquement les caractères ASCII les plus courants.
la source
Ils sont là principalement pour des raisons historiques. De nos jours, la plupart des claviers modernes pour la plupart des langues permettent d'accéder à tous ces caractères, mais cela posait autrefois un problème avec certains claviers européens. C'est pourquoi les trigraphes ont été inventés.
Si vous ne savez pas à quoi ils servent, vous ne devriez pas les utiliser.
Cependant, il est toujours bon d'en être conscient, car vous pourriez en utiliser un accidentellement et involontairement dans votre code.
la source