40 votes

Les digraphes et les trigraphes sont-ils utilisés aujourd'hui?

Étant donné qu'il avait une fois de raisons d'utiliser des bigrammes et trigraphs en C et C++, personne ne les mettez dans un code écrit aujourd'hui? Est-il une quantité importante de code hérité toujours en cours de maintenance qui les contient?

(Note: Ici, "digraphe" ne pas dire "graphe orienté." Les deux digraphe et trigraph avoir de multiples significations, mais l'usage prévu, voici les séquences comme ??= ou <: pour représenter des personnages comme # et [)

26voto

Keith Thompson Points 85120

Je ne sais pas pour vous, mais vous êtes plus susceptible de trouver des bigrammes et trigraphs être utilisé dans les environnements mainframe IBM. L' EBCDIC jeu de caractères n'inclut pas certains caractères qui sont nécessaires pour la C.

L'autre justification pour les bigrammes et trigraphs, 7-bit ASCII-ish jeux de caractères de remplacement de certains caractères de ponctuation, avec des lettres accentuées, est sans doute moins pertinent aujourd'hui.

En dehors de ces milieux, je pense que trigraphs sont plus couramment utilisés par erreur que délibérément, comme dans:

puts("What happened??!");

Pour référence, trigraphs ont été introduites en 1989, dans le C ANSI standard (qui, essentiellement, est devenu l'1990 ISO C standard). Ils sont les suivants:

??= #     ??) ]     ??! |
??( [     ??' ^     ??> }
??/ \     ??< {     ??- ~

Les remplacements se produire n'importe où dans le code source, y compris les commentaires et les littéraux de chaîne.

Bigrammes sont des fautes d'orthographe de certains tokens, et n'affectent pas les commentaires ou les littéraux:

<: [      :>   ]
<% {      %>   }
%: #      %:%: ##

Bigrammes ont été introduites par l'1995 amendement à l'1990 ISO C standard.

17voto

TemplateRex Points 26447

Il y a une proposition en attente pour le C++1z (le prochain standard C++1y seront normalisés en -espérons-le - C++14), qui vise à éliminer trigraphs de la Norme. Ils ont fait une étude de cas sur une autre non divulgués grande base de code:

Étude de cas

Les utilisations de trigraph-comme des constructions dans une grande base de code ont été examinés. Nous avons découvert:

923 cas d'une fuite ? dans un littéral de chaîne pour éviter trigraph remplacement: le patron de la chaîne() const { return "foo-????\?-de?????"; }

4 instances de trigraphs utilisé délibérément dans le code de test: deux dans la suite de test pour un compilateur, les deux autres dans une suite de tests pour du coup de pouce de préprocesseur de la bibliothèque.

0 instances de trigraphs être délibérément utilisé dans le code de production. Trigraphs continuent à poser un fardeau sur les utilisateurs de C++.

La proposition de notes (les caractères gras, italiques de l'origine de la proposition):

Si trigraphs sont retirés de la langue entièrement, un la mise en œuvre qui souhaite les soutenir, peuvent continuer à le faire: son la mise en œuvre définies par la cartographie physique du fichier source caractères la source de base de jeu de caractères peuvent inclure trigraph traduction (et pouvez même éviter de le faire dans les premières littéraux de chaîne). Nous n'avons pas besoin trigraphs dans la norme pour assurer la compatibilité ascendante.

8voto

Simon Points 431

Ils peuvent être utilisés pour le concours international de code Obscurcic C.

5voto

Clairvoire Points 2368

L'utilisation de tri et de di-des graphiques n'est pas écrit en ce jour, il n'existe que dans les très vieux code qui a été créé dans un nombre très limité de l'environnement. Tout code qui contient trigraphs, si vous tentez de compiler sur un compilateur moderne comme VS,il ne sera généralement pas compiler, sauf si vous spécifiez une option de l'éditeur de liens. Je sais que pour Visual Studio, que l'option est "/Zc:trigraphs"

Pourquoi ils existent, c'est parce que le C++ comité jamais les questions de changements qui permettrait de "casser" le code de legs. Pour le meilleur ou pour le pire. Il y a une anecdote que leur suppression a été proposée et appuyée, et il a été arrêté par un seul interlocuteur IBM.

3voto

Chrono Kitsune Points 2980

Je sais que c'est une vieille question, mais il est sans doute l'utilisation légitime de ces journées: des écrans tactiles sans un clavier réel. Par exemple, la disposition du clavier AMÉRICAIN n'est pas nécessairement disponible en pleine forme si vous n'avez aucun codage au moyen d'une tablette ou quelque chose comme ça, qui, certes, est heureusement très rare en raison de la façon dont il peut être fastidieux (trois clics sur le mien pour un opérateur d'affectation). Personnellement, je ne pas utiliser si possible, mais ils sont utiles en l'absence de réelle jetons qu'ils sont censés représenter.

Encore une fois, j'espère vraiment que les gens évitent de là où cela est possible, mais c'est une raison de les connaître et les utiliser.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X