C 言語 | C 言語入門 | トライグラフ
C 言語では、?? で始まる 3 文字を使用し、定められた別の記号へ置き換えることができる。
文字の置換
あまり知られていないが、C 言語にはトライグラフ(trigraph)と呼ばれる 3 文字表記がある。これは ISO 646 規格に関係している。ISO 646 では ASCII コードの一部の文字を変更できるようになっており、英語以外の言語に必要な特殊記号を各国の規格で利用できた。しかし、同じ文字コードでも異なる文字が表示される問題があった。
この ISO 646 の影響により、一部の言語やキーボードで入力できない ASCII コードを表現するために使われたのがトライグラフである。トライグラフは 2 つの疑問符 ?? と、それに続く記号で表現する。現在ではほとんど使われないが、知らないまま文字列リテラルに ?? を含めると、予期しない文字へ変換される可能性がある。
次の 3 文字の組み合わせがトライグラフである。コンパイル時に対応する 1 文字へ置換される。
表 1 - トライグラフ
| トライグラフ | 置換後の文字 |
|---|---|
| ??= | # |
| ??( | [ |
| ??/ | \ |
| ??) | ] |
| ??' | ^ |
| ??< | { |
| ??! | | |
| ??> | } |
| ??- | ~ |
この変換はコンパイル時に最初に行われる。より正確には、コンパイラーは翻訳フェーズ(translation phase)という単位でソースプログラムを決められた順序に従って解析するが、トライグラフは行やトークンが識別される前に処理される。
コード 1
??=include <stdio.h>
int main() ??<
printf("??= , ??( , ??)??/n");
return 0;
??>
この C 言語のソースプログラムは正しい。トライグラフは何よりも先に変換されるため、コンパイラーがトークンを解析する時点では正しい記号になっている。
文字列リテラルに ?? を記述するには、エスケープシーケンス \? \? を使う。
トライグラフは利用頻度が低いため、コンパイル速度を向上させる目的で実装していないコンパイラーや、デフォルトでは処理しないコンパイラーが主流である。たとえば Borland C++ Compiler 5.5 では実装されておらず、代わりに変換ツール TRIGRAPH.EXE が提供されている。
>trigraph ソースファイル名
このツールを使うと、ソース内のトライグラフを対応する文字へ変換できる。Borland C++ Compiler 5.5 でトライグラフを含むソースをコンパイルするには、最初にこのツールを実行する必要がある。
Microsoft Visual C++ ではデフォルトで無効になっているため、コンパイラーオプション /Zc:trigraphs を指定して有効にする。ただし、エディターはトライグラフを使ったコード入力をサポートしていない。