$ 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行目の空白が全角のスペースになっている。
カーソルを乗せてみるとわかるが、非常に気づきにくい間違い。
$ 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でも、なにも文句を言われないプログラムに仕上げるべき。
$ gcc -o prog1 prog1.c
prog1.c:1:stadio.h: No such file or directory
1: #include
2: #include
案外見られるベタなエラー。「そんなファイル(やディレクトリ)はないぞ」。
典型的な打ち間違いで、#include の指定間違い。
なお、gcc に続くところの prog1.cなどのファイル名を間違っても同じようなエラーがでるが、みれば普通は区別がつく。
$ gcc -o prog1 prog1.c
prog1.c:15:2: warning: no newline at end of file
案外みかけるけど、どうでもいい警告。
意味「ファイルの最後に改行がありません」。
ただ、プログラムを入力していって、最後の一行でEnterを押さなかった場合、最後の行だけ改行がない。
見た目はほとんど変わらないし、コンパイル結果がおかしくなるわけでもない。
かなりお節介警告。
ソースの最終行でEnterすれば出なくなる。