コンパイル時に、たとえば
$ 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"のようにエラーがでます。
このエラーは得体の知れない英語ではなく、比較的わかりやすい、意味のある英語です。
間違いをつぶしていくこつは、
典型的な文法的間違い。
ほぼ、キーワード(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行目にあるといっている。
元となったプログラム↓
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」にしている。
$ 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;などが必要。
$ 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行目の空白が全角のスペースになっている。 カーソルを乗せてみるとわかるが、非常に気づきにくい間違い。
$ 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他のエラーと見比べると、なんとなく雰囲気が違う。
しかし、プログラムが長くなるとどこにあるかが見つかりにくい。そういうときには、
$ 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というものを定義せずに使っていることに疑いをもたれている)。
9: for(i=0;i<10;i++) 10: { 11: j=j+1; 12: print("%d %d\n",i,j); 13: }
ちなみに、「-Wall」は「warning all」で、普段は「まあ、これくらい文句いわんでもいいか」という警告も含めて、ありったけ出す。本来は、-Wallでも、なにも文句を言われないプログラムに仕上げるべき。
$ gcc -o prog1 prog1.c prog1.c:1:stadio.h: No such file or directory
1: #include <stadio.h> 2: #include <math.h>案外見られるベタなエラー。「そんなファイル(やディレクトリ)はないぞ」。
$ gcc -o prog1 prog1.c prog1.c:15:2: warning: no newline at end of file案外みかけるけど、どうでもいい警告。