トライグラフ
概要
C言語のソースコードはASCIIの文字セットを用いて表記されるが、ISO 646で自由に文字を割り当てられる領域の文字まで使う文法となっている。特に、括弧類が別の文字に置き換わっているとソースコードの表記がしづらくなるので、ISO 646で自由割り当てでない文字を3つ組み合わせることで、それらの文字を表すこととした。これがトライグラフである。
JIS X 3010-1993では「3文字表記」JIS X 3014:2003では「三つ組表示」としており、定訳がないことからもっぱら「トライグラフ」とカタカナで書かれる。
処理
トライグラフの処理は、エスケープシーケンスやトークンの解釈に先立って行われるため、文字列内の表記も置き換わることとなる。文字列中にトライグラフと一致する3文字を書けるようにするために、単に?1文字を表すエスケープシーケンスである\?が用意されている。例えば、"?\?="と書いた場合、トライグラフとしての処理は行われず、その後にエスケープシーケンスが展開され、"??="という文字列となる。また、文字列リテラルを2つの?の間で分離する、という回避法も存在する。
利用
コンピュータで利用可能な文字コードは拡張が続き、1984年には8ビットのISO 8859-1が、1990年代以降は16ビット以上のUnicodeが制定された。これらのコードでは最初の128文字がASCIIと一致しているため、トライグラフを使わなくてもすべての文字を表記できる。
GCCやVisual C++ 2010など、明示的に有効にしなければトライグラフが無効となっている処理系もある。また、Borland C++ Compilerでは、コンパイル速度を上げるために、トライグラフ処理に専用のプリプロセッサを使うことになっている。さらに、トライグラフの使用について警告を出すことのできる処理系もあるなど、21世紀初頭に至っては、意図せずにトライグラフを書いてしまうことによる問題点が注意喚起なされるような状況と化している。
トライグラフの廃止
C++0x (後のC++11) ではトライグラフを廃止予定 (deprecated) とすることが提案されたが、IBM の (ほかの C++ 使用者を代弁する目的もあった) 反対により、一旦は維持されることとなった。しかし、C++17 における再度の提案では廃止予定 (deprecation) ではなく廃止 (removal) が提案され、これが標準化委員会の投票で承認されたことから、IBM の反対にも関わらずトライグラフは廃止されることとなった。トライグラフを使用した既存のコードは、ソースファイルからトライグラフをパースし、トライグラフを含まない基本文字セットに変換することでサポートされる。