トライグラフ
C ソース プログラムのソース文字セットは 7 ビットの ASCII 文字セット内に含まれますが、ISO 646-1983 Invariant Code Set のスーパーセットです。 トライグラフ シーケンスでは、ISO (国際標準化機構) の Invariant Code Set のみを使用して C プログラムを記述できます。 トライグラフは、2 つの連続する疑問符で始まる 3 文字のシーケンスで、これがコンパイラにより対応する区切り文字に置き換えられます。 トライグラフは、一部の区切り文字に対応する適切なグラフィック表示がない文字セットを含む C ソース ファイルで使用できます。
C++ 17 では、言語からトライグラフが削除されます。 トライグラフは実装で、物理ソース ファイルから基本ソース文字セットへの実装定義マッピングの一部として引き続きサポートされている場合もありますが、標準では実装でそのようにしないよう勧めています。 C++14 までトライグラフは C と同様にサポートされていました。
既定では無効ですが、トライグラフの置換は Visual C++ で引き続きサポートされています。 トライグラフの置換を有効にする方法の詳細については、「/Zc:trigraphs
(トライグラフの置換)」をご覧ください。
次の表は、9 つのトライグラフ シーケンスを示しています。 最初の列の区切り文字がソース ファイルに出現すると、すべて 2 番目の列の対応する文字に置き換えられます。
トライグラフ シーケンス
トライグラフ | 区切り文字 |
---|---|
??= |
# |
??( |
[ |
??/ |
\ |
??) |
] |
??' |
^ |
??< |
{ |
??! |
| |
??> |
} |
??- |
~ |
トライグラフは、常に 1 つのソース文字として処理されます。 トライグラフの変換は、文字列リテラルと文字定数のエスケープ文字を認識する前の、最初の変換フェーズで実行されます。 認識されるのは、上の表に示した 9 つのトライグラフだけです。 他の文字シーケンスは、変換されません。
文字エスケープ シーケンス \?
を使用すると、トライグラフに似た文字シーケンスが誤ってトライグラフとして解釈されないようにできます。 (エスケープ シーケンスについては、「エスケープ シーケンス」を参照してください。)たとえば、What??!
ステートメントを使用して文字列 printf
を印刷しようとして、次のようにしたとします。
printf( "What??!\n" );
出力される文字列は What|
です。これは、??!
がトライグラフ シーケンスであり、|
文字に置き換えられるためです。 この文字列を正しく印刷するには、次のようにステートメントを記述します。
printf( "What?\?!\n" );
この printf
ステートメントでは、2 番目の疑問符の前に円記号のエスケープ文字があることで、??!
が誤ってトライグラフとして解釈されないようになります。