広告スペース

第31回 コンパイルエラー辞典

C言語のコンパイルエラー一覧と対処法。gccのエラーメッセージの読み方を完全解説。

文法エラー ― コンパイルが通らない原因No.1

C言語のコンパイラ(gcc)は文法ミスを見つけると error: メッセージを出します。ファイル名:行番号: error: 内容 の形式です。
error: expected ';' before '}' token
原因:文末のセミコロン ; を忘れている。エラー行の1行前を確認。
int x = 10    // ← ここに ; がない
printf("%d", x);  // ← ここでエラーと言われる
覚え方:エラー行だけでなくその1行上も必ずチェック!
error: expected ')' before ';' token
原因:カッコ () の対応が合っていない。閉じカッコの数を数えよう。
printf("x=%d\n", x;  // ← ) が足りない
printf("x=%d\n", x);  // ← OK
error: expected '{' before '}' token / stray '\343' in program
原因:全角文字(全角スペース、全角カッコ)が紛れ込んでいる。目に見えにくいので特に厄介。
int x = 10; // ← = と 10 の間に全角スペース!
int x = 10;  // ← OK(半角スペース)
stray '\343' と出たらほぼ確実に全角文字が原因です。エディタの「全角スペース表示」機能をONに!
error: 'else' without a previous 'if'
原因:if文の {} の対応がずれて、elseが孤立している。
if (x > 0) {
  printf("正\n");
}} // ← } が1個多い → else が孤立
else { ... }

型エラー ― 宣言・型の不一致

変数の未宣言や型の間違いに関するエラーです。
error: 'x' undeclared (first use in this function)
原因パターン:
① 変数を宣言し忘れた
② 変数名のスペルミス(countcont
③ スコープ外で使おうとした(ブロック内で宣言した変数を外で参照)
#include の書き忘れ(printfが未定義になる)
error: incompatible types when assigning to type 'int' from type 'char *'
原因:型が合わない代入をしている。
int x = "hello"; // NG: int に文字列を代入
int x = 42;       // OK
error: too few / too many arguments to function 'foo'
原因:関数呼び出しの引数の数が宣言と合っていない。
int add(int a, int b) { return a+b; }

add(1);         // NG: too few (2つ必要なのに1つ)
add(1,2,3);     // NG: too many (2つなのに3つ)
add(1,2);       // OK
error: void value not ignored as it ought to be
原因:戻り値がvoidの関数の「結果」を変数に入れようとした。
void greet() { printf("Hi\n"); }
int r = greet(); // NG: voidには戻り値がない

警告(warning) ― 動くけど危険なコード

warningはコンパイルは通りますが、バグの予兆であることが多いです。-Wallオプションで全警告を有効にしましょう。
gcc -Wall program.c -o program  // すべての警告を表示
warning: implicit declaration of function 'printf'
原因:#include<stdio.h> を忘れている。
warning: format '%d' expects type 'int', but argument 2 has type 'double'
原因:printfの書式指定子と引数の型が不一致。
double pi = 3.14;
printf("%d\n", pi);  // NG: doubleに%d → %fを使う
printf("%f\n", pi);  // OK
warning: unused variable 'x'
原因:宣言した変数を使っていない。不要なら削除、使うつもりなら使い忘れ。
warning: control reaches end of non-void function
原因:戻り値ありの関数なのに return が書かれていないルートがある。
int max(int a, int b) {
  if (a > b) return a;
  // else の return が無い!
}
warning: suggest parentheses around assignment used as truth value
原因:if文で =(代入)を使っている。==(比較)の書き間違い?
if (x = 5)  // 警告!代入になっている
if (x == 5) // OK: 比較

エラー解読クイズ

gccのエラーメッセージを見て原因を当ててみましょう!
問題
広告スペース

関連する講座

繰り返し・配列・文字列
第15回 デバッグの技法
C言語のデバッグ方法。printfデバッグとよくあるバグの見つけ方を実践的に解説。
リファレンス編
第32回 実行時エラーとSegfault
C言語のSegmentation Faultの原因と対処法。実行時エラーを完全解説。
入門編
第4回 printf・scanf
C言語のprintf関数とscanf関数の使い方。書式指定子を一覧で解説。
← 前の講座
第30回 ソートアルゴリズム
次の講座 →
第32回 実行時エラーとSegfault

よくある質問(FAQ)

Q. コンパイルエラーで最も多い原因は何ですか?

A. 最も多い原因はセミコロン(;)の忘れです。次に括弧の不一致全角文字の混入が続きます。エラーメッセージを読む際は「エラーが報告された行の1行前」も必ずチェックしましょう。

Q. エラーメッセージの読み方がわかりません。どこを見るべき?

A. エラーメッセージは「ファイル名:行番号: error: 内容」の形式です。1. ファイル名と行番号を確認し、2. errorの後の説明文を読みます。説明が難しければ、エラーメッセージ全体をコピーしてネットで検索するのも効果的です。

Q. エラーと警告(warning)の違いは?

A. エラー(error)はコンパイルを止める深刻な問題で、修正必須です。警告(warning)はコンパイルは通りますが潜在的な問題を示唆しています。プロの開発では警告も修正するのが常識です。

Q. 「undeclared identifier」エラーはどう直す?

A. このエラーは変数や関数が宣言されていないことを意味します。対処法は:1. #includeを追加する、2. 変数を先に宣言する、3. スペルを確認するです。特に `stdio.h` を忘れるこのエラーが頻発します。

確認クイズ

この講座の理解度をチェックしましょう!

Q1. 「undeclared identifier」エラーの原因は?

変数が宣言されていない
セミコロンが抜けている
型が間違っている

使用している変数や関数が宣言されていない場合に発生します。スペルミスや #include の不足も原因になります。

Q2. セミコロン忘れのエラーはどこに表示される?

セミコロンが抜けた行
次の行(1行ずれる場合が多い)
ファイルの先頭

コンパイラはセミコロンがない行の次の行でエラーを報告することが多いです。エラー行の前後も確認しましょう。

Q3. 警告(warning)とエラー(error)の違いは?

違いはない
警告でもコンパイルは成功する
警告の方が深刻

error はコンパイルが失敗しますが、warning はコンパイルは成功します。ただし warning も修正すべきです。

この記事をシェア
X(Twitter)でシェア Facebookでシェア LINEで送る はてブ

この講座の理解を深めるおすすめ書籍

サイトで動きを理解し、書籍で演習量を補うと効果的です

📘
苦しんで覚えるC言語
MMGames 著
初心者向けの定番入門書。丁寧な解説で基礎を固められます。
Amazonで見る
📗
新・明解C言語 入門編
柴田望洋 著
図解が豊富で、演習問題も充実。大学の教科書としても採用多数。
Amazonで見る
📙
プログラミング言語C 第2版
B.W.カーニハン, D.M.リッチー 著
通称K&R。C言語の原典。基礎を終えた後のステップアップに最適。
Amazonで見る

※ 上記リンクはアフィリエイトリンクです。購入によりサイト運営を支援いただけます。