変換フェーズ
C および C++ プログラムは、それぞれがプログラムのテキストの一部を含む 1 つ以上のソース ファイルで構成されます。 ソース ファイルは、インクルード ファイル (#include
プリプロセッサ ディレクティブを使用して含まれたファイル) と共に、#if
などの条件付きコンパイル ディレクティブによって削除されたコードのセクションを除き、"翻訳単位" と呼ばれます。
ソース ファイルは、異なる時間に変換できます。 実際、古いファイルのみを変換するのも一般的です。 変換された翻訳単位は個別のオブジェクト ファイルまたはオブジェクト コード ライブラリに処理できます。 次に、変換された各翻訳単位は、実行可能プログラムやダイナミック リンク ライブラリ (DLL) を形成するためにリンクされます。 リンカーへの入力として使用できるファイルの詳細については、「LINK 入力ファイル」を参照してください。
翻訳単位は次を使用して通信できます。
外部リンケージを持つ関数の呼び出し。
外部リンケージを持つクラス メンバー関数の呼び出し。
外部リンケージを持つオブジェクトの直接的な変更。
ファイルの直接的な変更。
プロセス間通信 (Microsoft Windows ベースのアプリケーションのみ)。
次の一覧では、コンパイラがファイルを変換するフェーズについて説明します。
文字マッピング
ソース ファイルの文字はソースの内部表現にマップされます。 トライグラフ シーケンスはこのフェーズの単一文字の内部表現に変換されます。
ラインスプライシング
円記号 (\) で終了し、直後に改行文字が続くすべての行は、ソース ファイルの次の行に結合され、物理行から論理行を形成します。 これが空でない場合、ソース ファイルは前に円記号が付いていない改行文字で終了する必要があります。
トークン化
ソース ファイルはプリプロセッサ トークンと空白文字に分割されます。 ソース ファイル内のコメントは、それぞれ 1 個の空白文字と置き換えられます。 改行文字は保持されます。
前処理
前処理ディレクティブが実行され、マクロがソース ファイルに展開されます。 #include
ステートメントは、インクルードされたテキストで前の 3 つの書き換え手順から開始する変換を呼び出します。
文字セット マッピング
すべてのソース文字セット メンバーとエスケープ シーケンスは、実行文字セットの同等のものに変換されます。 Microsoft C および C++ にとって、ソース文字セットと実行文字セットはいずれも ASCII 文字セットです。
文字列連結
すべての隣接する文字列とワイド文字列リテラルは連結されます。 たとえば、"String " "concatenation"
が "String concatenation"
になります。
翻訳
すべてのトークンは、構文的および意味的に分析され、オブジェクト コードに変換されます。
リンケージ
すべての外部参照は実行可能プログラムまたはダイナミック リンク ライブラリを作成するために解決されます。
コンパイラは、構文エラーを検出した変換のフェーズ中に警告やエラーを発行します。
リンカーは、すべての外部参照を解決し、1 つ以上の個別に処理された翻訳単位を結合して、標準ライブラリと共に実行可能プログラムまたは DLL を作成します。