ISO C では、このような翻訳段階の順番が指定されています。
ソースファイル内のすべての 3 文字表記シーケンスが置換されます。ANSI/ISO C は、9 つの 3 文字表記シーケンスを持っています。これらのシーケンスはもともと文字セットの不完全な点を補うために導入されました。しかし、現在では、この 3 文字シーケンスは ISO 646-1983 文字セットに含まれない文字を指定するために使用されています。
表 6–1 3 文字シーケンス
3 文字シーケンス |
変換後の文字 |
---|---|
??= |
# |
??- |
~ |
??( |
[ |
??) |
] |
??! |
| |
??< |
{ |
??> |
} |
??/ |
\ |
??’ |
^ |
ISO C コンパイラは前述のシーケンスを理解するはずです。しかし、これらのシーケンスを使用することはお勧めしません。-xtransition オプションを使用したとき、移行モード (-Xt) では、ISO C コンパイラは 3 文字シーケンスを置換するたびに警告を発行します (コメント内でも)。たとえば、次の例を考えてください。
/* comment *??/ /* still comment? */ |
??/ はバックスラッシュになります。この文字とそれに続く改行は削除されます。結果として、次のようになります。
/* comment */* still comment? */ |
2 行目の最初の / は、コメントの終わりです。次のトークンは * です。
バックスラッシュと改行文字の組み合わせがすべて削除されます。
ソースファイルが前処理トークンと空白文字のシーケンスに変換されます。各コメントは必要最低限の空白文字で置換されます。
すべての前処理指令が処理され、すべてのマクロ呼び出しが置換されます。#include でインクルードされた各ソースファイルは、内容が指令行に置換される前の初期段階で実行されます。
すべてのエスケープシーケンス (文字定数と文字列リテラル) が解釈されます。
隣接する文字列リテラルが連結されます。
すべての前処理トークンが通常のトークンに変換されます。コンパイラはこれらのトークンを適切に構文解析して、コードを生成します。
すべての外部オブジェクトと関数参照が解釈処理され、最終的なプログラムになります。