コンテンツにスキップ

最終更新:2026-10-12

C++ トライグラフ

C++那些事 トライグラフの削除について

C++17 より前では、Trigraph は ISO/IEC 646 などの小さな文字コードでプログラムを書くための機能で、C89 で導入されました。 ISO/IEC 646 には C で使われる以下の文字が欠けているため、?? を使って以下の文字にエスケープします:

トライグラフの内容 置き換えられる内容
??= #
??( [
??) ]
??< {
??> }
??/ \
??! |
??- ~
??' ^

\? は、トライグラフ表によって置き換えられるのを防ぐためにエスケープされます。

C++17でトライグラフは削除され、??=などはもう置き換えられません。

例

C++17より前:

std::cout << "??=" << std::endl;
std::cout << "??(" << std::endl;
std::cout << "?\?(" << std::endl;

出力:

#
[
??(

C++17およびそれ以降:

??=
??(
??(

現在では、Unicodeなどの文字エンコーディングが普及しており、トライグラフはもはや不要であり、gccなどのコンパイラはデフォルトでトライグラフを無効にしています。

関連トピック

コメント