コンパイル時の典型的エラー集

[| ]  最終更新: 2011/02/10 19:35:57

エラー解消のこつ

コンパイル時に、たとえば
$ gcc -o prog1 prog1.c
prog1.c: In function `main':
prog1.c:9: error: syntax error before ';' token
prog1.c:9: error: syntax error before ')' token
prog1.c: At top level:
prog1.c:14: error: syntax error before "return"
のようにエラーがでます。

このエラーは得体の知れない英語ではなく、比較的わかりやすい、意味のある英語です。

などです。

間違いをつぶしていくこつは、

です。ある誤りがそのあとで連鎖的にエラーなどを引き起こすことがよくあるため、コンパイラのエラーの後ろのほうは、その行をみても全くわからないことがあります。
前のほうを修正して、消えたら、連鎖したエラーです。
(一カ所直して数十のエラーがすべて消えた、ということもあり)

エラー(error)

syntax error

典型的な文法的間違い。
ほぼ、キーワード(intとかfor)の打ち間違いが原因=誤りを探しやすいが、たまに原因がなかなか見つからないこともある。

$ gcc -o prog1 prog1.c
prog1.c: In function `main':
prog1.c:9: error: syntax error before ';' token
prog1.c:9: error: syntax error before ')' token
prog1.c: At top level:
prog1.c:14: error: syntax error before "return"
エラーは9行目にあるといっている。
曰く「;の前にエラー」「)の前にエラー」「14行目のreturnの前にエラー」

元となったプログラム↓

1: #include <stdio.h>
2: #include <math.h>
3: 
4: int main(void)
5: {
6:     int i,j;
7:
8:     j=0;
9:     fore(i=0;i<10;i++)
10:    {
11:         j=j+1;
12:         printf("%d %d\n",i,j);
13:    }
14:    return 0;
15:}
9行目の「for」を間違って「fore」にしている。
細かいことをいうと、「for」ならそのあとの()内に;が2個あるはず、一方、「fore」はそういう名前の関数とコンパイラが勘違いして、関数内に;は入れられないぞ、と文句を言っている。
ここで転けたため、最後の14行目returnでもプログラムとしてつじつまが合わなくなった。

undeclared

$ gcc -o prog1 prog1.c
prog1.c: In function `main':
prog1.c:8: error: `j' undeclared (first use in this function)
prog1.c:8: error: (Each undeclared identifier is reported only once
prog1.c:8: error: for each function it appears in.)
エラーは8行目にあって、「jが宣言されていない」。 「(..)」は「ここで初めて出てきた、何回あっても1回しかいわない」。
4:int main(void)
5:{
6:    int i;
7:
8:    j=0;
9:    for(i=0;i<100;i++)
一見すると、8行目にはなんの問題もないが、このエラーは「8行目でjをつかっているけど、そんなもの聞いていない」というエラー。8行目以前にint j;などが必要。
undeclaredがでたら、1:変数の宣言(用意)を忘れていないか、2:変数名を間違っていないか を確認する。

\数字 が含まれるエラー

$ gcc -o prog1 prog1.c
prog1.c: In function `main':
prog1.c:8: error: stray '\201' in program
prog1.c:8: error: syntax error at '@' token
prog1.c:8: error: stray '\201' in program
prog1.c:8: error: syntax error at '@' token
このエラーはプログラムで「"〜"」と「"」で括られた部分(表示用文字列など)以外で漢字ひらがななどの全角文字を使うと発生することがある。
つまり、変数名に漢字などは使えない。プログラムは原則として半角英数記号でかくこと。
7: 
8:   j=0;        // 8行目、実はj=0の前が全角のスペース2個
9:     for(i=0;i<10;j++)
10:    {
この元プログラム、一見するとなにも問題はないが、8行目の空白が全角のスペースになっている。 カーソルを乗せてみるとわかるが、非常に気づきにくい間違い。

undefined reference

$ gcc -o prog1 prog1.c
/cygdrive/c/DOCUME~1/kumagai/LOCALS~1/Temp/ccYvMFn4.o(.text+0x56):prog1.c: undefined reference to `_print'
collect2: ld returned 1 exit status
他のエラーと見比べると、なんとなく雰囲気が違う。
エラーの意味は「_printが見つからない」。 ただし、これはコンパイラの中の表現がでていて、ソースプログラムでいうと「printがみつからない」(先頭の "_"をとればいい)。
具体的には、どこかで "print"というものを使っているようだけど、どこにも見あたらないからプログラムとして完成できないという文句。この場合、"printf"の打ち間違いと見当がつく。

しかし、プログラムが長くなるとどこにあるかが見つかりにくい。そういうときには、

$ gcc -Wall -o prog1 prog1.c
prog1.c: In function `main':
prog1.c:12: warning: implicit declaration of function `print'
/cygdrive/c/DOCUME~1/kumagai/LOCALS~1/Temp/ccYr6VoH.o(.text+0x56):prog1.c: undefined reference to `_print'
collect2: ld returned 1 exit status
と「-Wall」を追加してコンパイルすると、「implicit...」というwarningが表示される。 この警告の意味は「printの定義が怪しい」(ここでは、printというものを定義せずに使っていることに疑いをもたれている)。
さしあたり、元もとのエラーも「printがない」といっているので共通の原因らしい。ソースは
9:     for(i=0;i<10;i++)
10:    {
11:         j=j+1;
12:         print("%d %d\n",i,j);
13:    }

と、printfであるべきところがprintになっている。

ちなみに、「-Wall」は「warning all」で、普段は「まあ、これくらい文句いわんでもいいか」という警告も含めて、ありったけ出す。本来は、-Wallでも、なにも文句を言われないプログラムに仕上げるべき。

No such file or directory

$ gcc -o prog1 prog1.c
prog1.c:1:stadio.h: No such file or directory
1: #include <stadio.h>
2: #include <math.h>
案外見られるベタなエラー。「そんなファイル(やディレクトリ)はないぞ」。
典型的な打ち間違いで、#include の指定間違い。
なお、gcc に続くところの prog1.cなどのファイル名を間違っても同じようなエラーがでるが、みれば普通は区別がつく。





警告(warning)

no newline at end of file

$ gcc -o prog1 prog1.c
prog1.c:15:2: warning: no newline at end of file
案外みかけるけど、どうでもいい警告。
意味「ファイルの最後に改行がありません」。
ただ、プログラムを入力していって、最後の一行でEnterを押さなかった場合、最後の行だけ改行がない。 見た目はほとんど変わらないし、コンパイル結果がおかしくなるわけでもない。
かなりお節介警告。
ソースの最終行でEnterすれば出なくなる。










熊谷正朗 [→連絡]
東北学院大学 工学部 機械知能工学科 RDE
[| ]