Le but de Trigraph séquences en C++?
Selon C++03 Standard 2.3/1:
Avant tout autre traitement a lieu, chaque occurrence de l'une des séquences suivantes de trois personnages (“trigraph séquences”) est remplacé par le caractère unique indiqué dans le Tableau 1.
---------------------------------------------------------------------------- | trigraph | replacement | trigraph | replacement | trigraph | replacement | ---------------------------------------------------------------------------- | ??= | # | ??( | [ | ??< | { | | ??/ | \ | ??) | ] | ??> | } | | ??’ | ˆ | ??! | | | ??- | ˜ | ----------------------------------------------------------------------------
Dans la vie réelle qui signifie que le code printf( "What??!\n" );
entraînera l'impression What|
parce que ??!
est un trigraph séquence qui est remplacé par le |
caractère.
Ma question est ce que le but de l'utilisation de trigraphs? Est-il un avantage pratique de l'utilisation de trigraphs?
UPD: Dans les réponses a été mentionné que, en europe, certains des claviers n'ont pas tous les caractères de ponctuation, donc non NOUS les programmeurs ont à utiliser trigraphs dans la vie de tous les jours?
UPD2: Visual Studio 2010 a trigraph soutien désactivée par défaut.
- Certains signes de ponctuation est plus difficile à atteindre européenne claviers (au point que certains programmeurs utilisent le clavier AMÉRICAIN à taper plus vite) n'en ai pas vu où les signes de ponctuation est entièrement disparu - peut-être pour les langues slaves?
- Il peut arriver que certains terminaux et/ou de virtualisation de ne pas vous laisser facilement accès à certains personnages. Dans mon expérience, la principale cause est le tilde.
- de taper sur mon DE-les touches mortes clavier, # est un touche next pour revenir, \ est "alt gr"+"ß" (près de 0), ^ est "^"+"^" (en raison de touches mortes; à côté, 1), [ est "alt gr"+"8", ] est "alt gr"+"9", | est "alt gr"+"<", { est "alt gr"+"7", } est "alt gr"+"0", et ~ est "~"+"~" (en raison de touches mortes, juste au-dessus de #). donc pas vraiment une grosse affaire. mes doigts sont telles que la saisie de ces combinaisons sur leur propre 😀
- J'ai pensé, qu'il est normal d'avoir deux configurations de clavier et de basculer entre eux, selon le travail que je fais sur l'ordinateur. C'est la façon la plus commune en Europe centrale de la région. C'est assez effrayant pour l'utilisation de ces trigraphs. J'avais vote pour la suppression de ce de la norme.
- Parce que "la source de jeu de caractères de C source des programmes est contenue à l'intérieur de l'ASCII 7 bits jeu de caractères mais c'est un sur-ensemble de la norme ISO 646-1983 Invariant Code Jeu........"
- Vous avez votre souhait!
- Pour info, trigraphs sera supprimé en C++17, malgré les protestations de IBM. L'adaptation du code qui utilise trigraphs sera simple, parce que trigraphs sont vraiment facile à analyser.
- Nous discutons de C++03 Standard ici. La publication de la nouvelle norme ne signifie pas que tous les systèmes dans le monde le prend en charge instantanément. Et la question était de savoir le but initial de cette fonctionnalité.
- À mon avis, je dirais trigraphs existent encore principalement à l'écriture d'obfuscation de code
:-)
Vous devez vous connecter pour publier un commentaire.
Cette question (à propos de la étroitement liée bigrammes) a la réponse.
Elle se résume au fait que la norme ISO 646 jeu de caractères n'a pas tous les personnages de la syntaxe du C, donc il y a des systèmes avec les claviers et les écrans qui ne peut pas traiter avec les personnages (même si j'imagine que ces dernières sont très rares de nos jours).
En général, vous n'avez pas besoin de les utiliser, mais vous avez besoin de les connaître pour exactement le problème que vous avez couru dans. Trigraphs sont la raison pour laquelle le '
?
caractère' a une séquence d'échappement:De sorte qu'un couple de façons que vous pouvez éviter que votre exemple de problème sont:
Mais vous devez vous rappeler quand vous êtes en train de saisir les deux"? " des personnages que vous pourriez être à partir d'un trigraph (et ce n'est jamais quelque chose que je suis en train de réfléchir).
Dans la pratique, trigraphs et bigrammes sont quelque chose que je ne vous inquiéter au jour le jour. Mais vous devriez être au courant d'entre eux, car une fois tous les deux ans, vous allez rencontrer un bug lié à eux (et vous passerez le reste de la journée en maudissant leur existence). Ce serait bien si les compilateurs peut être configuré pour avertir (ou d'erreur) quand il vient à travers un trigraph ou digraphe, afin que je puisse savoir que j'ai obtenu quelque chose que je doit sciemment traiter.
Et juste pour être complet, bigrammes sont beaucoup moins dangereux, car ils peuvent être traités comme des jetons, donc un digraphe à l'intérieur d'un littéral de chaîne ne sera pas interprété comme un digraphe.
Pour une belle éducation sur les différents amusant avec des signes de ponctuation dans les programmes C/C++ (y compris un trigraph bug qui faisait que le defintinely me tirant de mes cheveux), jetez un oeil à Herb Sutter est GOTW #86 article.
Addendum:
Il ressemble à GCC de ne pas traiter (et de les avertir d') trigraphs par défaut. Certains autres compilateurs ont des options pour désactiver trigraph de soutien (IBM par exemple). Microsoft a commencé à soutenir un avertissement (C4837) dans VS2008 qui doivent être explicitement activé (à l'aide de Mur ou quelque chose).
De
The C++ Programming Language
Édition Spéciale, page 829`
, qui est absent de l'italien et de plusieurs autres dispositions de clavierLes enfants d'aujourd'hui! 🙂
Oui, étrangères de l'équipement, tel qu'un IBM 3270 terminal. Le 3270 a, si je me souviens, pas d'accolades! Si vous souhaitez écrire C sur un IBM mini /mainframe, vous avait à utiliser le malheureux trigraphs pour chaque limite de bloc. Heureusement, je n'avais qu'à écrire des programmes en C pour émuler certains mini-ordinateurs IBM installations, et non pas à l'écriture de C logiciel sur le Système/36.
Regardez à coté de la touche "P":
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 cause de chagrin si vous aviez à écrire C.
Aussi, ces terminaux d'affichage EBCDIC, IBM "native" mainframe jeu de caractères non ASCII (merci, Pavel Minaev, pour le rappel).
D'autre part, comme la GNU C guide dit: "Vous n'en avez pas besoin des dommages au cerveau." Le compilateur gcc laisse cette "fonctionnalité" est désactivé par défaut.
Ils sont pour une utilisation sur les systèmes qui manquent de certains des caractères en C++de jeu de caractères de base. Inutile de dire que de tels systèmes sont extrêmement rares.
Trigraphs ont été proposées pour l'enlèvement dans C++0x. Cela dit, il semble y avoir encore de solides arguments à l'appui de leur - voir C++ comité de papier N2910 qui traite de ce type. Apparemment, EBCDIC est l'une des principales forteresse où ils sont nécessaires.
J'ai vu trigraphs utilisé dans le début des années 90 pour aider à convertir PL/1 programmes à partir d'un mainframe à exécuter/compilé/débogage sur un PC.
Ils ont été barboteurs avec l'édition de PL/I sur le PC à l'aide de PL/I du compilateur C, et ils ont voulu que le code fonctionne quand il est déplacé de retour à l'ordinateur central qui ne supporte pas d'accolades. J'ai suggéré qu'ils pourraient utiliser des macros comme
ou comme un plus convivial PL/I alternative
et si vraiment ils voulaient obtenir la fantaisie, ils pourraient essayer
et ensuite, le programme serait de regarder comme il a été écrit en Pascal. Ils ont juste me regarda d'un drôle et de ne pas parler de moi 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. Ouverture de fichiers sur le PC était tellement différent de l'ordinateur central, il aurait introduit trop de kludges de garder le même code en cours d'exécution sur les deux.
En europe, certains claviers ne pas (ne pas?) ont tous les caractères de ponctuation que NOUS les claviers avait, parce qu'ils avaient besoin les clés de leur peu de caractères alphabétiques. Ainsi, par exemple, (ce qui), le suédois clavier aurait Un anneau où l'accolade était.
Pour accommoder les utilisateurs, trigraphs sont un moyen pour entrer des signes de ponctuation à l'aide de la plus courante des caractères ASCII.
Principalement parce que le C standard introduit en 1989, quand il y avait des problèmes avec la présence des personnages qui trigraphs carte sur certaines machines. Par le temps de la norme C++ a été publié en 1998, la nécessité pour trigraphs n'était pas grande. Ils sont une verrue sur C; ils sont tout autant une verrue sur le C++. Il y avait un besoin pour eux - en particulier en dehors du monde anglophone- qui est pourquoi ils ont été ajoutés à C.
Ils sont là principalement pour des raisons historiques. De nos jours, la plupart des claviers modernes pour la plupart des langues de permettre l'accès à tous ces personnages, mais cette habitude d'être un problème une fois avec de l'europe, certains des claviers. C'est pourquoi trigraphs ont été inventés.
Si vous ne savez pas ce qu'ils sont, vous ne devriez pas les utiliser.
Il est toujours bon d'être au courant d'entre eux, cependant, puisque vous pourriez accidentellement et involontairement utiliser dans votre code.