C言語におけるトライグラフ (・) とは、ISO 646 に共通して含まれる文字だけでソースコードを書くための表記法である。

概要 C言語のソースコードはASCIIの文字セットを用いて表記されるが、ISO 646で自由に文字を割り当てられる領域の文字まで使う文法となっている。特に、括弧類が別の文字に置き換わっているとソースコードの表記がしづらくなるので、ISO 646で自由割り当てでない文字を3つ組み合わせることで、それらの文字を表すこととした。これが3文字表記であるTrigraphs マイクロソフト(英語)、2011年4月25日閲覧。。

一覧 ISO 646 で文字が不定のコードは10あるが、そのうち「$」はC言語では使用しないため、3文字表記はそのうち9文字に規定されている。

+3文字表記の一覧 3文字表記の表記 表される文字??= #??( [??/ ??) ]??' ^??< {??! |??> }??- ~

処理 3文字表記の処理は、エスケープシーケンスや字句の解釈に先立って行われるため、文字列内の表記も置き換わることとなる。文字列中に3文字表記と一致する3文字を書けるようにするために、単に?1文字を表すエスケープシーケンスである\?が用意されているEscape Sequences マイクロソフト(英語)、2011年4月25日閲覧。。例えば、"?\?="と書いた場合、3文字表記としての処理は行われず、その後にエスケープシーケンスが展開され、"??="という文字列となる。また、文字列リテラルを2つの?の間で分離する、という回避法も存在するPRE07-C. "??" の繰り返しは避ける JPCERTコーディネーションセンター、2010年5月17日(2014年5月8日閲覧)。。

利用 計算機で利用可能な文字コードは拡張が続き、1984年には8ビットのISO 8859-1が、1990年代以降は16ビット以上のUnicodeが制定された。これらのコードでは最初の128文字がASCIIと一致しているため、3文字表記を使わなくてもすべての文字を表記できる。

GCCC Dialect Options GCCマニュアル(英語)、フリーソフトウェア財団、2011年4月25日閲覧。やVisual C++ 2010Visual C++ での互換性に影響する変更点 マイクロソフト、2011年4月25日閲覧。など、明示的に有効にしなければ3文字表記が無効となっている処理系もある。また、Borland C++ Compilerでは、コンパイル速度を上げるために、3文字表記処理に専用のプリプロセッサを使うことになっているBorland C++ Compiler FAQ エンバカデロ・テクノロジーズ、2011年4月25日閲覧。さらに、3文字表記の使用について警告を出すことのできる処理系もあるWarning Options GCCマニュアル(英語)、フリーソフトウェア財団、2011年4月25日閲覧。コンパイラの警告 (レベル 4) C4837 マイクロソフト、2011年4月25日閲覧。など、21世紀初頭に至っては、意図せずに3文字表記を書いてしまうことによる問題点が注意喚起なされるような状況と化している。

3文字表記の廃止 C++11の検討段階では、3文字表記を廃止予定 (deprecated) とすることが提案されたC++0X, CD 1, National Body Comments, SC22/WG21 N2837, 2009-01-30 comment UK 11が、IBM の (ほかの C++ 使用者を代弁する目的もあった) 反対によりComment on Proposed Trigraph Deprecation, by Michael Wong, Hubert Tong, Robert Klarer, Ian McIntosh, Raymond Mak, Christopher Cambly, Alain LaBonté, N2910, 2009-06-19、一旦は維持されることとなった。しかし、C++17 における再度の提案では廃止予定 (deprecation) ではなく廃止 (removal) が提案され"Removing trigraphs??!", N3981, Richard Smith, 2014-05-06、これが標準化委員会の投票で承認されたことから、IBM の反対にもかかわらず3文字表記は廃止されることとなったIBM comment on preparing for a Trigraph-adverse future in C++17, IBM paper N4210, 2014-10-10. Authors: Michael Wong, Hubert Tong, Rajan Bhakta, Derek Inglis。3文字表記を使用した既存のコードは、ソースファイルから3文字表記を解釈し、3文字表記を含まない基本文字セットに変換することでサポートされる。

また、C23においても3文字表記は廃止された。

関連項目 エスケープ文字

脚注

出典

参考文献