波括弧の閉じ忘れで 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文も同じ罠があります。ループの{を閉じ忘れると、後続のコードがすべてループの中身として解釈されます。
直し方: (空) を } にします。
パターン4
1 #include <stdio.h> 2 3 int main(void) { 4 while (0) { 5 printf("never\n"); 6 ^ 7 return 0; 8 }
main.c:8:1: error: expected declaration or statement at end of input
while文の{を閉じ忘れても同じ罠にかかります。ファイルの終わりまでブロックが閉じないままになります。
直し方: (空) を } にします。
パターン5
1 #include <stdio.h> 2 3 void greet(void) { 4 printf("hi\n"); 5 ^ 6 7 int main(void) { 8 greet(); 9 return 0; 10 }
main.c:10:1: error: expected declaration or statement at end of input
main関数以外の関数でも同様です。greet関数の{を閉じ忘れると、後続のmain関数の中身まで巻き込まれます。
直し方: (空) を } にします。
よくある誤解
エラーは必ずファイルの最後の行を指しますが、実際に直すべき場所は閉じ忘れた{が開かれた場所です。関数やif文が入れ子になっているコードほど、どの{が対応不足かを目で追うのが難しくなります。
実務での勘所
この種のミスを構造的に防ぐ実務の習慣は、波括弧を開いたら即座に閉じ括弧も書いてから、カーソルをその間に戻して中身を書き始めることです。多くのエディタが{を入力した瞬間に}を自動挿入するのは、まさにこの習慣を後押しするためです。自動挿入された}を手で消してから自分で書き直すと、対応関係を崩しやすいので避けたほうが安全です。