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

概要 編集

C言語のソースコードはASCIIの文字セットを用いて表記されるが、ISO 646で自由に文字を割り当てられる領域の文字まで使う文法となっている。特に、括弧類が別の文字に置き換わっているとソースコードの表記がしづらくなるので、ISO 646で自由割り当てでない文字を3つ組み合わせることで、それらの文字を表すこととした。これが3文字表記である[2]

一覧 編集

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

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

処理 編集

3文字表記の処理は、エスケープシーケンス字句の解釈に先立って行われる[2]ため、文字列内の表記も置き換わることとなる。文字列中に3文字表記と一致する3文字を書けるようにするために、単に?1文字を表すエスケープシーケンスである\?が用意されている[3]。例えば、"?\?="と書いた場合、3文字表記としての処理は行われず、その後にエスケープシーケンスが展開され、"??="という文字列となる。また、文字列リテラルを2つの?の間で分離する、という回避法も存在する[4]

利用 編集

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

GCC[5]Visual C++ 2010[6]など、明示的に有効にしなければ3文字表記が無効となっている処理系もある。また、Borland C++ Compilerでは、コンパイル速度を上げるために、3文字表記処理に専用のプリプロセッサを使うことになっている[7]。さらに、3文字表記の使用について警告を出すことのできる処理系もある[8][9][4]など、21世紀初頭に至っては、意図せずに3文字表記を書いてしまうことによる問題点が注意喚起なされる[4]ような状況と化している。

3文字表記の廃止 編集

C++0x (後のC++11) では3文字表記を廃止予定 (deprecated) とすることが提案された[10]が、IBM の (ほかの C++ 使用者を代弁する目的もあった) 反対により[11]、一旦は維持されることとなった。しかし、C++17 における再度の提案では廃止予定 (deprecation) ではなく廃止 (removal) が提案され[12]、これが標準化委員会の投票で承認されたことから、IBM の反対にもかかわらず3文字表記は廃止されることとなった[13]。3文字表記を使用した既存のコードは、ソースファイルから3文字表記を解釈し、3文字表記を含まない基本文字セットに変換することでサポートされる[12]

関連項目 編集

脚注 編集

出典 編集

  1. ^ JISX3010 2003, 5.2.1.1.
  2. ^ a b c Trigraphs マイクロソフト(英語)、2011年4月25日閲覧。
  3. ^ Escape Sequences マイクロソフト(英語)、2011年4月25日閲覧。
  4. ^ a b c PRE07-C. "??" の繰り返しは避ける JPCERT/CC、2010年5月17日(2014年5月8日閲覧)。
  5. ^ C Dialect Options GCCマニュアル(英語)、フリーソフトウェア財団、2011年4月25日閲覧。
  6. ^ Visual C++ での互換性に影響する変更点 マイクロソフト、2011年4月25日閲覧。
  7. ^ Borland C++ Compiler FAQ エンバカデロ・テクノロジーズ、2011年4月25日閲覧
  8. ^ Warning Options GCCマニュアル(英語)、フリーソフトウェア財団、2011年4月25日閲覧。
  9. ^ コンパイラの警告 (レベル 4) C4837 マイクロソフト、2011年4月25日閲覧。
  10. ^ C++0X, CD 1, National Body Comments, SC22/WG21 N2837, 2009-01-30 comment UK 11
  11. ^ Comment on Proposed Trigraph Deprecation, by Michael Wong, Hubert Tong, Robert Klarer, Ian McIntosh, Raymond Mak, Christopher Cambly, Alain LaBonté, N2910, 2009-06-19
  12. ^ a b "Removing trigraphs??!", N3981, Richard Smith, 2014-05-06
  13. ^ 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

参考文献 編集