不明メタ文字をC/C++の文字列リテラル?
-
13-09-2019 - |
質問
作成した新しいプロジェクトは次のコードセグメント:
char* strange = "(Strange??)";
cout << strange << endl;
により以下の出力:
になっ]
このように翻訳'??)' -> ']'
デバッグすると私のchar*文字列リテラルでは実際には、その価値ではなストリームです。このことは明らかであるメタ文字列を表示何らかのUnicodeワイドcharの配列でしょうか?そうではないと思うし...たって無効にすべての関連プロジェクトの設定に無い.
誰でも説明?
- 検索:"という問いマーク、マーク、ブレース'c c++の文字列リテラル
解決
あなたが見ている のトリグラフのに呼ばれています。
大人によって書かれた言語で、1疑問符がどのような状況のために十分です。一度に複数のを使用しないでください、あなたはこれを再び見ることは決してないだろう。
GCCはほとんど誰もが意図的にそれらを使用しているため、デフォルトではトリグラフを無視します。 -trigraph
オプションでそれらを有効にするか、-Wtrigraphs
オプションでそれらに関する警告をコンパイラに伝えます。
のVisual C ++ 2010はまた、それらをデフォルトで無効にし、それらを有効にする/Zc:trigraphs
を提供しています。私は、以前のバージョンでそれらを有効または無効にする方法については何も見つけることができません。
他のヒント
簡単な方法:「??」を分割2文字列リテラルます:
char* strange = "(Strange??)";
char* strange2 = "(Strange?" "?)";
/* ^^^ no punctuation */
の編集の
gccがトリグラフについて警告するオプションがあります:-Wtrigraphs
(も-Wall
で有効)
の最後の編集の
標準からの引用
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.
これはトライグラフに!
??)トライグラフのである。
これはトリグラフのサポートです。あなたは、任意の文字をエスケープすることにより、トリグラフの解釈を防ぐことができます:
char* strange = "(Strange?\?)";
これはトリグラフするます。
トリグラフの理由です。記事のCについての話もC ++にも適用されます。
と、まさに噛まれるtrigraph.この前で問題となりました。
できるのはどのように\?'エスケープシーケンスの'?'文字:
char* strange = "(Strange\?\?)";
この理由としてエスケープシーケンスがやや不思議なればわからない人気trigraphs.
したがって、何らかのクロスコンパイルにGCCで持っ配列として trigraph:
いいでに無効にこのプロジェクトによるデフォルトの出来のみで作成の問題だった。(使用していくキーボードのレイアウトとにかく)
デフォルトの動作は、GCCを無視しなければならない警告を発するのではなくメソがVisual Studio2010を採用し、標準と分かっています。