トラック4・🚪はじめてのC

コンパイルエラーと友達になる

読む目安 約12分・ゴール:エラーメッセージ1行を分解して読み、最初の1件から順に直せるようになる

アプリでこのトピックを学ぶ(無料・登録不要)

このトピックの要点

コンパイルを実行したら赤い文字がずらっと出た——この瞬間に心が折れる人はとても多いです。ですがエラーメッセージは、あなたを責めているのではありません。どこで困ったかを教えてくれる、いちばん正確な相談相手です。読み方さえ分かれば怖くありません。

エラー1行の構造

gcc の場合、1行はこう並んでいます。

// hello.c:5:29: error: expected ';' before 'return'
//   ファイル名 :行:桁 : 種類 : 内容

左から順に、ファイル名・行番号・桁番号・種類(error か warning)・内容です。つまり「hello.c の5行目29桁目、return の前にセミコロンが要る」。ここまで読めれば、直す場所はほぼ決まります。

よく出る3つ

#include <stdio.h>

int main(void) {
    printf("合計\n")
    return 0;
}

→ error: expected ';' before 'return'。「return の前にセミコロンが要る」。足りないのは実際には1つ前の行です。エラーは「気づいた場所」に出るので、直す場所が1行上になることはよくあります。

int main(void) {
    printf("こんにちは\n");
    return 0;
}

→ warning: implicit declaration of function 'printf'。「printf という関数の宣言を見ていません」。#include <stdio.h> の書き忘れです。warning はコンパイルが通ってしまうこともありますが、放置してはいけません。多くは本物のバグの前触れです。

#include <stdio.h>

int main(void) {
    printf("%d\n", tensuu);
    return 0;
}

→ error: 'tensuu' undeclared (first use in this function)。「tensuu という名前は知りません」。変数を作っていないか、綴りを間違えています。

鉄則——上から1個だけ直す

エラーが20行出ても、原因は1つということがよくあります。セミコロンが1つ欠けただけで、その後ろの解釈がすべてずれるからです。一番上のエラーだけ直して、もう一度コンパイルする。 これを繰り返すと、20行が一気に0になることも珍しくありません。

師範エラーの数に意味は無い。意味があるのは最初の1件だけじゃ。下から読む者は、影を追いかけて日が暮れるぞ。

罠・注意

error と warning は別物。 error は実行ファイルができません。warning はできることがありますが、必ず読んで消します。

リンク段階のエラーは別枠。 undefined reference to 'main' のようなメッセージは、コンパイルの後の「リンク」で出ます。関数の中身が見つからない、というサインです。

英文を飛ばさない。 expected(〜が要る)、undeclared(宣言されていない)、too few arguments(引数が少ない)、incompatible type(型が合わない)。10個ほど覚えれば、たいてい読めます。

まとめ

エラー行は「ファイル:行:桁: 種類: 内容」の順で読みます。直す場所は指摘の1行上のこともあります。常に一番上の1件から直し、全部を読んで絶望しないことが最短ルートです。

アプリでこのトピックを学ぶ(無料・登録不要)

確認問題

確認問題 1

次のエラーメッセージの 5 が表しているのは ____ です。

// hello.c:5:29: error: expected ';' before 'return'
  1. エラーが起きた行番号
  2. エラーの件数
  3. エラーの深刻度
  4. ファイル全体の行数
答えを見る

正解:A(エラーが起きた行番号)

この1行は「ファイル名:行番号:桁番号: 種類: 内容」の順に並んでいます。hello.c の5行目29桁目で return の前にセミコロンが要る、という報告です。ただし足りないのは1つ前の行であることが多いので、指摘された行の1つ上も必ず見ます。

確認問題 2

コンパイルしたら、エラーが12件まとめて表示されました。最初にやるべきことはどれですか。

  1. いちばん下のエラーから順に直す
  2. 12件すべてを読み終えてから、まとめて直す
  3. いちばん上のエラーを1件だけ直して、もう一度コンパイルする
  4. エラーが多すぎるので、最初から書き直す
答えを見る

正解:C(いちばん上のエラーを1件だけ直して、もう一度コンパイルする)

セミコロン1つの欠けで、その後ろの解釈がすべてずれることがあります。つまり12件のうち11件は「巻き添え」の可能性が高いのです。一番上の1件を直して再コンパイルすると、残りが一気に消えることも珍しくありません。

「はじめてのC」の目次

  1. 開発環境ゼロで始める——このポータルの使い方
  2. Hello, World! を解剖する
  3. main関数と#include
  4. コンパイルエラーと友達になる
  5. printfで画面に出す——書式指定の基本
  6. scanfで入力を受け取る
  7. scanfの罠——入力の恐怖を越える
  8. コメントとコードの整え方

もっと先へ:ポインタ・メモリ・ファイル入出力・セキュアコーディングを含む全26トラックと、段位検定・模試のフルセットは完全版に収録しています。

完全版の販売ページは準備中です。

ほかのトラック

📚 姉妹教材:手を動かして覚える Linux 教材 — Linuxとインフラの仕組みを地図で学ぶ

Web版