トライグラフ
C言語におけるトライグラフ (英語: trigraph) とは、ISO 646 に共通して含まれる文字だけでソースコードを書くための表記法である。
概要[編集]
C言語のソースコードはASCIIの文字セットを用いて表記されるが、ISO 646で自由に文字を割り当てられる領域の文字まで使う文法となっている。特に、括弧類が別の文字に置き換わっているとソースコードの表記がしづらくなるので、ISO 646で自由割り当てでない文字を3つ組み合わせることで、それらの文字を表すこととした。これがトライグラフである[1]。
JIS X 3010-1993では「3文字表記」JIS X 3014:2003では「三つ組表示」としており、定訳がないことからもっぱら「トライグラフ」とカタカナで書かれる。
一覧[編集]
ISO 646 で文字が不定のコードは10あるが、そのうち「$」はC言語では使用しないため、トライグラフはそのうち9文字に規定されている[1]。
トライグラフの表記 | 表される文字 |
---|---|
??= |
#
|
??( |
[
|
??/ |
\
|
??) |
]
|
??' |
^
|
??< |
{
|
??! |
|
|
??> |
}
|
??- |
~
|
処理[編集]
トライグラフの処理は、エスケープシーケンスやトークンの解釈に先立って行われる[1]ため、文字列内の表記も置き換わることとなる。文字列中にトライグラフと一致する3文字を書けるようにするために、単に?
1文字を表すエスケープシーケンスである\?
が用意されている[2]。例えば、"?\?="
と書いた場合、トライグラフとしての処理は行われず、その後にエスケープシーケンスが展開され、"??="
という文字列となる。また、文字列リテラルを2つの?
の間で分離する、という回避法も存在する[3]。
利用[編集]
コンピュータで利用可能な文字コードは拡張が続き、1984年には8ビットのISO 8859-1が、1990年代以降は16ビット以上のUnicodeが制定された。これらのコードでは最初の128文字がASCIIと一致しているため、トライグラフを使わなくてもすべての文字を表記できる。
GCC[4]やVisual C++ 2010[5]など、明示的に有効にしなければトライグラフが無効となっている処理系もある。また、Borland C++ Compilerでは、コンパイル速度を上げるために、トライグラフ処理に専用のプリプロセッサを使うことになっている[6]。さらに、トライグラフの使用について警告を出すことのできる処理系もある[7][8][3]など、21世紀初頭に至っては、意図せずにトライグラフを書いてしまうことによる問題点が注意喚起なされる[3]ような状況と化している。
トライグラフの廃止[編集]
C++0x (後のC++11) ではトライグラフを廃止予定 (deprecated) とすることが提案された[9]が、IBM の (ほかの C++ 使用者を代弁する目的もあった) 反対により[10]、一旦は維持されることとなった。しかし、C++17 における再度の提案では廃止予定 (deprecation) ではなく廃止 (removal) が提案され[11]、これが標準化委員会の投票で承認されたことから、IBM の反対にも関わらずトライグラフは廃止されることとなった[12]。トライグラフを使用した既存のコードは、ソースファイルからトライグラフをパースし、トライグラフを含まない基本文字セットに変換することでサポートされる[11]。
関連項目[編集]
脚注[編集]
- ^ a b c Trigraphs マイクロソフト(英語)、2011年4月25日閲覧。
- ^ Escape Sequences マイクロソフト(英語)、2011年4月25日閲覧。
- ^ a b c PRE07-C. "??" の繰り返しは避ける JPCERT/CC、2010年5月17日(2014年5月8日閲覧)。
- ^ C Dialect Options GCCマニュアル(英語)、フリーソフトウェア財団、2011年4月25日閲覧。
- ^ Visual C++ での互換性に影響する変更点 マイクロソフト、2011年4月25日閲覧。
- ^ Borland C++ Compiler FAQ エンバカデロ・テクノロジーズ、2011年4月25日閲覧
- ^ Warning Options GCCマニュアル(英語)、フリーソフトウェア財団、2011年4月25日閲覧。
- ^ コンパイラの警告 (レベル 4) C4837 マイクロソフト、2011年4月25日閲覧。
- ^ C++0X, CD 1, National Body Comments, SC22/WG21 N2837, 2009-01-30 comment UK 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
- ^ a b "Removing trigraphs??!", N3981, Richard Smith, 2014-05-06
- ^ 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