Frage

Ich habe ein neues Projekt mit dem folgenden Code-Segment:

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

was in der folgenden Ausgabe:

  

(Seltsam]

So übersetzt '??)' -> ']'

Debuggen es zeigt, dass mein char * Stringliteral ist eigentlich, dass Wert und es ist kein Strom Übersetzung. Dies ist offensichtlich nicht eine Meta-Zeichensequenz ich je gesehen habe. Irgendeine Art von Unicode oder breite Zeichen-Sequenz vielleicht? Ich glaube nicht, so aber ... Ich habe versucht, ohne Erfolg alle zugehörigen Projekteinstellungen zu deaktivieren.

Wer eine Erklärung?

  • Suche: 'Fragezeichen, Fragezeichen, in der Nähe Klammer' c c ++ Stringliteral
War es hilfreich?

Lösung

Was Sie sehen, genannt wird ein trigraph .

In der geschriebenen Sprache von Erwachsenen, ein Fragezeichen ist für jede Situation ausreichend. Nicht mehr als ein zu einer Zeit, und Sie werden nie wieder sehen.

GCC ignoriert trigraphs standardmäßig, weil kaum jemand sie absichtlich verwendet. Aktivieren Sie sie mit der -trigraph Option, oder sagen Sie dem Compiler Sie sie mit der -Wtrigraphs Option zu warnen.

Visual C ++ 2010 deaktiviert sie auch standardmäßig aktiviert und bietet /Zc:trigraphs sie zu aktivieren. Ich kann nichts über Wege finden, zu ermöglichen oder sie in früheren Versionen zu deaktivieren.

Andere Tipps

Einfache Möglichkeit, die trigraph Überraschung zu vermeiden: split ein „??“ Stringliteral in zwei:

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

Bearbeiten
gcc hat eine Option über trigraphs zu warnen: -Wtrigraphs (aktiviert mit -Wall auch)
Ende bearbeiten

Zitate aus der Norm

    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.

Es ist ein Trigraph !

??) ist ein trigraph .

Das ist trigraph Unterstützung. Sie können trigraph Interpretation verhindern, indem sie eines der Zeichen zu entkommen:

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

Es ist ein trigraph .

Trigraphen sind der Grund. Der Vortrag über C in dem Artikel gilt auch für C ++

Wie mehrfach erwähnt, werden Sie von einem trigraph gebissen zu werden. Sehen Sie diese vorherige SO Frage für weitere Informationen:

Sie können das Problem beheben, indem die Verwendung von ‚\?‘ Escape-Sequenz für das ‚?‘ Charakter:

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

In der Tat, das ist der Grund für diese Escape-Sequenz, die etwas geheimnisvoll ist, wenn Sie keine Kenntnis von diesen verdammten trigraphs sind.

Beim Versuch, auf Quer kompiliert auf GCC es meine Sequenz als trigraph :

Also alles, was ich jetzt tun müssen, ist herauszufinden, wie dies standardmäßig in Projekten zu deaktivieren, da ich nur sehen, kann es zu Problemen für mich zu schaffen. (Ich bin mit einem US-Tastaturlayout sowieso)

Das Standardverhalten auf GCC ist zu ignorieren, aber eine Warnung, die viel mehr gesund ist und ist in der Tat, was Visual Studio 2010 als Standard annehmen wird, soweit ich weiß.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top