第3回
ソースの入力から完成まで

コンパイルエラーとリンクエラー

こうして、一発で実行形式ファイルが出来上がったらラッキーです。今回のサンプルのように単純なソースなら……と思っていても、軽く考えて意外なミスをしている場合もあります。ましてや、何十~何百行のソースともなれば、間違いのない方が不自然なくらいです。そして、エラーメッセージに遭遇します。生成工程でコンパイルとリンクの2つのプログラムが実行されるのですから、エラーにもコンパイラのエラーとリンカのエラーの2種類があります。

コンパイラのエラー

致命的エラーと警告(warning)に分かれます。

致命的エラーとはコンパイラが処理を続行できないレベルのエラーで、中間言語ファイルは生成されません。最初の段階では、行の最後に;記号がない場合や,と.を間違えたりすることで、思わぬエラーメッセージがたくさん表示されたりします。

警告は、本来は正しくないけれど取りあえず何らかの措置をして(要するに急場しのぎですが)コンパイラは処理を続行できるレベルのエラーです。

宣言されていない識別子(変数名など)が使われていたり、変数が何らかの値で初期化される前に参照(式の中で利用)されている場合などが原因となります。

リンカのエラー

ソース内で宣言されていない関数を使っても、コンパイラは「それが他のモジュールに存在するのだろう」と仮定して処理を進め、中間言語ファイルを出力します。

そしてリンクの段階で、他のモジュール内にもライブラリにも存在しない関数名だと判明したらリンクエラーとなり、リンカがエラーメッセージを出力します。

怒濤のエラーメッセージ

特にコンパイラのエラーは、Cにはじめて触れる人にとっては衝撃的です。数十行程度のソースで最初の;を忘れただけでも、それに付随するたくさんのエラーが怒濤のごとく表示される場合があるからです。

このことについては、もう少し複雑なソースを扱うようになってから、改めて取り上げましょう。とにかく、表示されたエラーメッセージは上から順に確認して処理していくことが大事です。最初のエラーを訂正すれば、それに付随するエラーもすべて解決されて、エラーメッセージが嘘のように減少することもよくあります。

このことについても、回を追って詳しくその理由などを説明します。また、エディタとコンパイラ・ドライバを連携させて、コマンドライン版のツールを統合環境のように扱う方法も紹介しようと思います。

あとがき


このコラムももう3回目なのですから、一般のC入門だったらこのあたりでそれなりの短いプログラムを作り、これが関数であれが変数で……と、基本のお作法を紹介しているところでしょう。

が、このコラムの対象はある程度VBやVCを知っている人です。基礎的なお作法は、既に書籍や雑誌で習得されていることでしょう。

そのようなわけで、普段は統合環境に隠れて見えなくなっている『ソースから実行形式ファイルができあがるまで』の過程を紹介しました。ビルド一発でできあがる短いプログラムも、裏ではいろいろな処理が行われているのです。