Question

J'ai créé un nouveau projet avec le segment de code suivant:

char* strange = "(Strange??)";
cout << strange << endl;

aboutissant à la sortie suivante:

  

(étrange]

Ainsi traduire '??)' -> ']'

Débogage il montre que mon char * chaîne littérale est en fait que la valeur et ce n'est pas une traduction de flux. Ceci est évidemment pas une séquence méta caractères que j'ai jamais vu. Une sorte de séquence char Unicode ou large peut-être? Je ne pense pas cependant ... Je l'ai essayé de désactiver tous les paramètres liés au projet sans résultat.

Quelqu'un at-il une explication?

  • recherche: point d'interrogation, point d'interrogation, accolade fermante 'c c ++ chaîne de caractères
Était-ce utile?

La solution

Qu'est-ce que vous voyez est appelé trigraphes .

Dans la langue écrite par les adultes, une marque de question est suffisante pour toute situation. Ne pas utiliser plus d'un à la fois et vous ne verrez jamais cela à nouveau.

GCC ignore trigraphes par défaut parce que presque personne les utilise intentionnellement. Activez-les avec l'option -trigraph, ou dire au compilateur de vous avertir à leur sujet avec l'option -Wtrigraphs.

Visual C ++ 2010 également les désactive par défaut et offre /Zc:trigraphs pour leur permettre. Je ne peux pas trouver quoi que ce soit sur les moyens de les activer ou les désactiver dans les versions antérieures.

Autres conseils

Un moyen facile d'éviter la surprise trigraphes: diviser un « ?? » chaîne littérale en deux:

char* strange = "(Strange??)";
char* strange2 = "(Strange?" "?)";
/*                         ^^^ no punctuation */

Modifier gcc a une option pour mettre en garde trigraphes: -Wtrigraphs (activé avec -Wall aussi)
modifier fin

Citations de la norme

    5.2.1.1 Trigraph sequences
1   Before any other processing takes place, each occurrence of one of the
    following sequences of three characters (called trigraph sequences13))
    is replaced with the corresponding single character.
           ??=      #               ??)      ]               ??!      |
           ??(      [               ??'      ^               ??>      }
           ??/      \               ??<      {               ??-      ~
    No other trigraph sequences exist. Each ? that does not begin one of
    the trigraphs listed above is not changed.
    5.1.1.2 Translation phases
1   The precedence among the syntax rules of translation is specified by
    the following phases.
         1.   Physical source file multibyte characters are mapped, in an
              implementation-defined manner, to the source character set
              (introducing new-line characters for end-of-line indicators)
              if necessary. Trigraph sequences are replaced by corresponding
              single-character internal representations.

Il est un Trigraph !

??) est un trigraph .

C'est trigraphes soutien. Vous pouvez empêcher l'interprétation des trigraphes en échappant à l'un des caractères:

char* strange = "(Strange?\?)";

Il est un trigraphes .

trigraphs sont la raison. Le discours sur C dans l'article applique également C ++

Comme il est mentionné à plusieurs reprises, vous être mordu par un trigraphes. Voir cette question précédente SO Pour plus d'informations:

Vous pouvez résoudre le problème en utilisant le '\? séquence d'échappement pour le « ? » Caractère:

char* strange = "(Strange\?\?)";

est en fait, la raison de cette séquence d'échappement, ce qui est quelque peu mystérieuse si vous n'êtes pas au courant de ces foutus trigraphes.

Tout en essayant de compilation croisée sur GCC, il a pris ma séquence en tant que trigraphes :

Donc tout ce que je dois faire maintenant comprendre comment désactiver ce dans les projets par défaut puisque je ne peux le voir créer des problèmes pour moi. (J'utilise une disposition de clavier américain de toute façon)

Le comportement par défaut sur GCC est d'ignorer, mais donner un avertissement, ce qui est beaucoup plus sain d'esprit et est bien ce que Visual Studio 2010 adoptera comme la norme pour autant que je sais.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top