コンパイルエラーを読む

エラーメッセージは敵ではありません

第 2 回で見たとおり、C はコンパイルの段階で書き方の誤りを見つけて止まります。このとき出るメッセージは英語で、初めて見ると身構えますが、書式は毎回同じです。読む順番さえ決めてしまえば、ほとんどの誤りは 1 分で直せます。

典型的なメッセージを見てください。

/* main.c:4:41: error: expected ';' after expression 4 | printf("成績管理システム\n") | ^ */

読み方は次のとおりです。

  • main.c は、誤りがあるファイルの名前です
  • 続く 4行番号41 が桁番号です。まずこの行を開きます
  • error はコンパイルが止まる致命的な誤り、warning は翻訳は通るが怪しい箇所です
  • そのうしろの英文が原因です。expected ';' なら「セミコロンがあるはずの場所に無い」という意味です
  • 下に該当行が引用され、^ が問題の桁を指します

行番号は「気づいた場所」であって「原因の場所」ではない

いちばんの落とし穴がここです。コンパイラは上から順に読んでいって、辻褄が合わなくなった時点で報告します。セミコロンの付け忘れは、次の行まで読んで初めて分かるので、報告される行が実際に直すべき行の 1 つ下になる ことがよくあります。

ですから、指された行を見て何もおかしくないときは、必ず 1 行上を疑って ください。閉じカッコやコメントの */ の書き忘れでは、原因がもっと上にあることもあります。

上から 1 つずつ直す

エラーが 5 個並んでいても、慌てる必要はありません。1 個目の誤りのせいで、そのあとの解釈が全部ずれて、連鎖的に 4 個増えているだけ、ということがよくあります。

手順は、いちばん上のエラーを 1 つ直して、もう一度コンパイルする。これだけです。まとめて直そうとすると、直した場所と減ったエラーの対応が分からなくなります。

よく出る 2 つのメッセージ

1 つ目は expected ';' です。前の文のセミコロン忘れです。

2 つ目は call to undeclared functionuse of undeclared identifier です。「その名前を知りません」という意味で、綴りの打ち間違いか、#include の書き忘れが原因です。C は大文字と小文字を区別するので、Printf も知らない名前として扱われます。親切なコンパイラは did you mean 'printf'? と候補まで出してくれます。

この学習画面では、コンパイラのメッセージがそのまま表示されます。今回は わざと壊したコード が置いてあります。まず提出してエラーを出し、行番号と英文を読んでから直してください。

要件

  1. コンパイルが通るようにする
  2. 1行目に 成績管理システム、2行目に 起動しました と表示する
  3. 誤りは2か所で、どちらもこの章で学んだ内容

入出力例

main("") → "成績管理システム 起動しました"

ヒント

生田 陸人
ゆめさくエンジニア / 現役ソフトウェアエンジニア
編集 LuaGate編集部
main.c
学習モード

メモ

コンパイルエラーを読む

⌘S で保存