Domanda

Ho creato un nuovo progetto con il seguente segmento di codice:

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

con conseguente il seguente output:

  

(Strano]

Così tradurre '??)' -> ']'

Debug si vede che il mio char * stringa letterale è in realtà che il valore e non è una traduzione flusso. Questo ovviamente non è una sequenza di meta-personaggio che abbia mai visto. Una sorta di Unicode o un'ampia sequenza di char forse? Io non la penso così però ... Ho provato disabilitando tutte le impostazioni del progetto legato inutilmente.

Qualcuno ha una spiegazione?

  • Ricerca: 'punto interrogativo, punto interrogativo, vicino brace' c c ++ stringa letterale
È stato utile?

Soluzione

Quello che stai vedendo è chiamato un trigraph .

Nel linguaggio scritto da adulti, un punto di domanda è sufficiente per qualsiasi situazione. Non utilizzare più di uno alla volta e non vedrai mai di nuovo.

GCC ignora trigrammi per default, perché quasi nessuno li utilizza intenzionalmente. consentono loro con l'opzione -trigraph, o dire al compilatore di che avvisa su di loro con l'opzione -Wtrigraphs.

Visual C ++ 2010 li disattiva anche per impostazione predefinita e offre /Zc:trigraphs per consentire loro. Non riesco a trovare nulla di modi per attivare o disattivarli nelle versioni precedenti.

Altri suggerimenti

Un modo semplice per evitare la sorpresa trigraph: dividere una "??" stringa letterale in due:

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

Modifica
GCC ha un'opzione per mettere in guardia su trigrammi: -Wtrigraphs (abilitata con -Wall anche)
modifica end

Dichiarazioni dalla standard

    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.

E 'un Trigraph !

??) è una trigraph .

Ecco trigraph supporto. È possibile impedire l'interpretazione trigraph fuggendo qualsiasi dei caratteri:

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

E 'un trigraph .

trigrammi sono la ragione. Il parlare di C in questo articolo si applica anche a C ++

Come già detto più volte, sei stato morso da un trigraph. Vedere questo precedente domanda Così, per ulteriori informazioni:

È possibile risolvere il problema utilizzando il '\?' sequenza di escape per il '?' carattere:

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

In realtà, questo è il motivo di tale sequenza di escape, che è un po 'misterioso, se siete a conoscenza di quei maledetti trigrammi.

Durante il tentativo di cross-compilare su GCC raccolse la mia sequenza come un trigraph :

Quindi tutto quello che dovete fare ora è capire come disattivare questo in progetti di default dal momento che posso vedere solo creare problemi per me. (Sto usando un layout di tastiera degli Stati Uniti in ogni caso)

Il comportamento di default su GCC è ignorare, ma dare un avvertimento, che è molto più sano di mente ed è in effetti ciò che Visual Studio 2010 sarà adottato come standard per quanto ne so.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top