But des séquences Trigraphiques en C++?

selon la norme C++'03 2.3/1:

avant tout autre traitement, chaque occurrence d'une des séquences suivantes de trois caractères ("séquences trigraphiques") est remplacée par le caractère unique indiqué au tableau 1.

----------------------------------------------------------------------------
| trigraph | replacement | trigraph | replacement | trigraph | replacement |
----------------------------------------------------------------------------
| ??=      | #           | ??(      | [           | ??<      | {           |
| ??/      |            | ??)      | ]           | ??>      | }           |
| ??’      | ˆ           | ??!      | |           | ??-      | ˜           |
----------------------------------------------------------------------------

dans la vie réelle qui signifie que le code printf( "What??!n" ); se traduira par l'impression What| parce que ??! est une séquence trigraphique qui est remplacé par le caractère | .

ma question Est de savoir à quoi sert l'utilisation de trigraphes? y a-t-il un avantage pratique à utiliser des trigraphes?

UPD : dans les réponses a été mentionné que certains claviers européens n'ont pas tous les caractères de ponctuation, de sorte que non-US programmeurs doivent utiliser des trigraphes dans la vie quotidienne?

UPD2 : Visual Studio 2010 has trigraph soutien désactivée par défaut.

114
demandé sur Kirill V. Lyadvinsky 2009-08-05 21:15:39

9 réponses

à Cette question (à propos de la étroitement liée bigrammes) a la réponse.

cela se résume au fait que le jeu de caractères ISO 646 n'a pas tous les caractères de la syntaxe C, donc il y a certains systèmes avec des claviers et des affichages qui ne peuvent pas traiter avec les caractères (bien que j'imagine que ceux-ci sont assez rares de nos jours).

en général, vous n'avez pas besoin de les utiliser, mais vous devez savoir à leur sujet pour exactement le problème que vous avez couru dans. Les trigraphes sont la raison pour laquelle le caractère ? "a une séquence d'évasion:

'\?'

donc deux façons d'éviter votre problème d'exemple sont:

 printf( "What?\?!\n" ); 

 printf( "What?" "?!\n" ); 

mais tu dois te rappeler quand tu tapes les deux?'personnages que vous pourriez être en train de commencer un trigraphe (et il est certainement jamais quelque chose que je pense).

dans la pratique, les trigraphes et les digraphes sont quelque chose que je ne vous inquiétez pas sur un jour le jour base. Mais vous devez être conscient d'eux parce qu'une fois tous les deux ans, vous tomberez sur un bug lié à eux (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 Erreur) quand il tombe sur un trigraphe ou un digraphe, donc je pourrais savoir que j'ai quelque chose que je devrais traiter en toute connaissance de cause.

et juste pour l'exhaustivité, digraphs sont beaucoup moins dangereux car ils obtiennent traité 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 les divers amusements avec ponctuation dans les programmes C/C++ (y compris un bug trigraph qui me ferait définitivement arracher mes cheveux), jetez un oeil à Herb Sutter's GOTW #86 article .


Addendum:

il semble que GCC ne traitera pas (et mettra en garde contre) trigraphs par défaut. Certains autres compilateurs ont des options pour désactiver le support trigraph (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).

87
répondu Michael Burr 2017-05-23 12:26:26

à Partir de The C++ Programming Language Édition Spéciale, page 829

les caractères spéciaux ASCII [ , ] , { , } , | , et \ occupent des positions de caractères alphabétiques désignées par L'ISO. Dans la plupart des jeux de caractères nationaux européens ISO-646, ces positions sont occupées par des lettres qui ne se trouvent pas dans l'alphabet anglais.

un ensemble de trigraphes est fourni pour permettre à national les caractères doivent être exprimés de façon portable en utilisant un jeu de caractères minimal vraiment standard. Cela peut être utile pour l'échange de programmes, mais cela ne rend pas plus facile pour les gens de lire des programmes. Naturellement, la solution à long terme à ce problème est que les programmeurs C++ obtiennent des équipements qui prennent en charge à la fois leur langage natif et C++. Malheureusement, cela semble être impossible pour certains, et l'introduction de nouveaux équipements peut être un très lent processus.

20
répondu Rob 2009-08-05 17:19:42

les enfants aujourd'hui! :- )

Oui, équipement étranger, tel qu'un terminal IBM 3270. Le 3270 a, Si je me souviens bien, pas de bretelles bouclées! Si vous voulez écrire C sur un IBM mini / mainframe, vous a dû utiliser les trigraphes misérables pour chaque limite de bloc. Heureusement, j'ai seulement eu à écrire le logiciel en C à émuler certaines installations miniordinateur IBM, pas réellement écrire le logiciel C sur le système/36.

regardez à côté de la touche "P" : http://www.9999hp.net/keyboard/temp/1389260-big.jpg

Hmmm. Difficile de le dire. Il y a un bouton à côté de "retour chariot", et je pourrais en arrière: c'était peut-être le "[" / "]" paire qui manquait. En tout cas, ce clavier vous causerait du chagrin si vous deviez écrire C.

aussi, ces terminaux affichent EBCDIC, le jeu de caractères "natif" de l'ordinateur central D'IBM, pas 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.

18
répondu Roboprog 2009-08-05 17:54:46

ils sont destinés à être utilisés sur des systèmes qui ne possèdent pas certains des caractères de base de C++. Il va sans dire que ces systèmes sont extrêmement rares.

13
répondu CB Bailey 2009-08-05 17:18:10
Il a été proposé de supprimer les trigraphes

en C++0x. Cela dit, il semble toujours y avoir de solides arguments à l'appui de ceux - ci-voir le document du comité c++ N2910 qui traite de cette question. Apparemment, EBCDIC est l'un des principaux bastions où ils sont nécessaires.

8
répondu Pavel Minaev 2009-08-05 17:39:34

j'ai vu des trigraphes utilisés au début des années 90 pour aider à convertir les programmes PL/1 à partir d'un ordinateur central à exécuter/compiler/déboguer sur un PC.

ils étaient en train d'éditer PL/I sur le PC à l'aide d'un compilateur PL/I to C et ils voulaient que le code fonctionne quand on le ramenait à l'ordinateur central qui ne supportait pas les broches bouclées. J'ai suggéré qu'ils pourraient utiliser des macros comme

#def BEGIN {    
#def END }  

ou comme un plus convivial PL/I alternative

#def BEGIN ??<
#def END ??>

et s'ils voulaient vraiment obtenir Fantaisie, ils pourraient essayer

#ifdef MAINFRAME
    #def BEGIN ??<
    #def END ??>
#else
    #def BEGIN {    
    #def END }  
#endif

et puis le programme aurait l'air d'avoir été écrit en Pascal. Ils m'ont regardé bizarrement et n'ont pas voulu me parler pour le reste de la journée. Je ne pense pas que je le leur reprocher. :)

Ce qui a tué l'effort de ce pas le tri-graphes, c'était le système e / s de différences entre les plates-formes. Ouvrir des fichiers sur le PC était tellement différent de l'ordinateur principal qu'il aurait introduit beaucoup trop de kludges pour garder le même code sur les deux.

4
répondu Kelly S. French 2013-01-10 15:01:54

certains claviers Européens ne le font pas (n'est-ce pas?) ont tous les caractères de ponctuation que les claviers américains avaient, parce qu'ils avaient besoin des clés pour leurs caractères alphabétiques inhabituels. Ainsi, par exemple, (ce qui), le suédois clavier aurait Un anneau où l'accolade était.

pour accommoder ces utilisateurs, les trigraphes sont un moyen d'entrer la ponctuation en utilisant seulement les caractères ASCII les plus communs.

3
répondu Ned Batchelder 2013-05-11 13:45:34

principalement parce que la norme C les a introduits en 1989, quand il y avait des problèmes avec la présence des caractères que les trigraphes mappent sur certaines machines. Au moment de la publication de la norme C++ en 1998, le besoin en trigraphes n'était pas très grand. Ils sont une verrue sur C; ils sont tout autant une verrue sur le C++. Il y avait un besoin pour eux - particulièrement en dehors du monde anglophone-ce qui explique pourquoi ils ont été ajoutés à C.

2
répondu Jonathan Leffler 2009-08-05 17:24:53

Ils sont là principalement pour des raisons historiques. Aujourd'hui, la plupart des claviers modernes pour la plupart des langues permettent l'accès à tous ces caractères, mais cela a été un problème autrefois 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.

il est toujours bon d'en être conscient, cependant, puisque vous pourriez accidentellement et involontairement en utiliser un dans votre code.

2
répondu sbi 2015-08-19 08:16:12