| "Hello, world" プログラムでは規模が小さいのであまり問題になりませんが、プログラムが大きくなってくると後で見たときにどの部分がどんな処理をしているのかがわからなくなってしまいます。そうならないために、普通はコメントを書いておきますね。 | ||
| C でのコメントは /* COMMENT */ のように書きます。C++ では // を使った書き方もあります。 | ||
|
||
| コメントは、コンパイラにとってはあってもなくても一緒です。なので、自分や後で読む別の人にわかりやすいように好きなように書くことができます。「あってもなくても一緒」というのは、本当に文字通りにそうです。厳密に言うと、コンパイルに先だってプリプロセス(前処理)という段階があって、コメントはそのときに削除されているのです。 | ||||
|
[プリプロセス]
↓ [コンパイル] ↓ [リンク] |
||||
| 以前にコンパイルとリンクについて説明したときには「プリプロセス」という言葉は出てきませんでした。なぜかというと、普通「コンパイルする」と言うときは、プリプロセスとコンパイルを合わせた処理のことをそう呼んでいるからです。プログラムのソースファイルを普通にコンパイラにかけると、まずプリプロセスによってコメントが取り除かれ、それから本格的にコンパイルが始まります。 | ||
| プリプロセスで行われるのはコメントの除去だけではありません。インクルードファイルの処理もプリプロセスで行われます(他にも #define によるマクロ展開や #if、 #line などの処理も行われます)。 | ||
| インクルードファイル処理では、プログラム中の #include と書かれた部分に本当にそのファイルの中身が挿入されます。と言ってもソースファイルに埋め込まれて上書きされてしまっては困るので、内部的に架空のファイルが作られます。全部のインクルードが完了するとソースコードはとても長くなりますが、その長くなった状態のプログラムがコンパイラに渡されます。例えば実際に "stdio.h" などの中身を見てみると、またその中に #include があったりして、全部展開すると大変な行数になるのがわかると思います。 | ||
| インクルードなどのプリプロセスが完了してできた状態のコードを「翻訳単位(translation unit)」とか「コンパイルユニット」などと言います。翻訳単位1つごとにコンパイルが実行されて、オブジェクトファイルが1つできます。最後にこれらがリンクされて実行形式のプログラムになるわけです。 | ||
| 使っている開発環境によっては、プリプロセスだけ行った状態のコードを見ることができます。もしそういう機能があるなら、コンパイル直前のコードがどうなっているのか見てみましょう。実物を見ると、コンパイラがどういう風に動作しているのかのイメージがつかめると思います。 | ||
("Hello, ANOTHER world!" は2001年11月から2002年11月にかけて作成されたコンテンツです。)