この知識をここでまとめておきましょう。まず、いくつかの段階があることを明確にすることから始めましょう。
1.プリコンパイル段階
2.コンパイル段階
3.コンパイル段階
4.リンキングフェーズ
以下、各ステージで具体的に何が行われているのか、各ステージごとに説明します。
プリコンパイル段階
その仕事は
1. #defineフィールド代入、マクロ代入としても知られています。LINE__、 FILE、TIME__のような組み込みの前処理マクロがあります。また、__attribute__もあります。
2.#includeの内容を置き換えます。
4.条件付きコンパイルの取り扱い
5.行番号とファイルラベルを追加して、デバッグやコンパイル時にどのファイルがどの行なのか分かるようにします。
6.コンパイラは#pragmaコンパイラ・ディレクティブを使用する必要があるため、#pragmaコンパイラ・ディレクティブを保持します。
この段階では構文エラーのチェックはありません。この段階で.iファイルが生成されます。
コンパイル段階
コンパイル段階は、高レベル言語を低レベルのアセンブリ言語に変換するところです。この段階で構文がチェックされます。コンパイルが実行されます。コンパイルは、字句解析、構文解析、意味解析、最適化の各段階に分けられます。
コンパイル段階
この段階は、低レベルのアセンブリ言語をマシン語にすることです。.oファイルの生成
リンク段階
ターゲットファイルから参照される外部ライブラリのコードをリンクして実行ファイルを生成する段階です。リンクは動的リンクと静的リンクに分けられます。静的リンクとは、外部ライブラリのコードをバイナリファイルにコピーすることで、重複コピーが発生する可能性がありますが、クロスプラットフォームに適しています。動的リンクは、外部ライブラリのコードセグメントを実行時に再配置するもので、コードの共有が可能ですが、静的リンクほどクロスプラットフォームではありません。C++はオーバーロードをサポートしていますが、オーバーロードされた関数が複数ある場合、リンカはどれをリンクすればよいかわからなくなります。例えば、void func(char ch)とvoid func(int i)は_func_char, _func_intになります。 しかし、C++はオーバーロードをサポートしていないため、C++は名前を変更しません。このとき、C++にCのコンパイルルールを使わせるためにextern Cを指定する必要があります。詳しくはこちらの記事をご覧ください。