error: expected declaration or statement at end of input の原因と直し方
波括弧{}の対応が崩れ、閉じ忘れがあるときに出るエラーです。ファイルの終わりまで読んでもブロックが閉じられないため、末尾でエラーになります。
エラーメッセージの読み方
main.c:5:5: error: expected declaration or statement at end of input
main.c- ファイル名
5- 行番号
5- 列番号 — この位置でgccが構文解析に失敗しました
expected declaration or statement at end of input- 内容 — 期待していたもの、または受け付けられなかったもの
このエラーが出る典型パターン
パターン1
1 #include <stdio.h> 2 3 int main(void) { 4 printf("hi\n"); 5 return 0; 6 ^
main.c:5:5: error: expected declaration or statement at end of input
main関数を開いた{を閉じ忘れています。ファイルの終わりまで読んでもブロックが閉じないため、末尾でエラーになります。
直し方: (空) を } にします。
広告
広告スロット(未設定)
パターン2
1 #include <stdio.h> 2 3 int main(void) { 4 int x = 5; 5 if (x > 0) { 6 printf("positive\n"); 7 ^ 8 return 0; 9 }
main.c:9:1: error: expected declaration or statement at end of input
if文の{を閉じないと、それ以降の行がすべてif文の中に取り込まれてしまい、最後の}がmain関数ではなくif文を閉じることになります。結果としてmain関数自体が閉じられないままファイルが終わります。
直し方: (空) を } にします。
パターン3
1 #include <stdio.h> 2 3 int main(void) { 4 for (int i = 0; i < 3; i++) { 5 printf("%d\n", i); 6 ^ 7 return 0; 8 }
main.c:8:1: error: expected declaration or statement at end of input
for文も同じ罠があります。ループの{を閉じ忘れると、後続のコードがすべてループの中身として解釈されます。
直し方: (空) を } にします。
よくある誤解
エラーは必ずファイルの最後の行を指しますが、実際に直すべき場所は閉じ忘れた{が開かれた場所です。関数やif文が入れ子になっているコードほど、どの{が対応不足かを目で追うのが難しくなります。
まとめ
error: expected declaration or statement at end of inputは初級でつまずきやすい項目です。上の3パターンを実際に手で直すと、エラーメッセージのどこを読めばよいかが掴めます。