Code Fix

初級

error: expected '}' at end of input の原因と直し方

波括弧{}の対応が崩れ、閉じ忘れがあるときに出るエラーです。ファイルの終わりまで読んでもブロックが閉じられないため、末尾でエラーになります。

エラーメッセージの読み方

main.cpp:7:2: error: expected '}' at end of input
main.cpp
ファイル名
7
行番号
2
列番号 — この位置でg++が構文解析に失敗しました
expected '}' at end of input
内容 — 期待していたもの、または受け付けられなかったもの

このエラーが出る典型パターン

パターン1

 1  #include <iostream>
 2  int main() {
 3      if (true) {
 4          std::cout << "yes" << std::endl;
 5       
        ^
 6      return 0;
 7  }
main.cpp:7:2: error: expected '}' at end of input

if文の{を閉じ忘れると、それ以降の行がすべてif文の中に取り込まれてしまい、最後の}はmain関数ではなくif文を閉じることになります。結果としてmain関数自体が閉じられないままファイルが終わります。

直し方: (空) を } にします。

この問題を解いてみる →

広告
広告スロット(未設定)

パターン2

 1  #include <iostream>
 2  int main() {
 3      for (int i = 0; i < 3; i++) {
 4          std::cout << i << std::endl;
 5       
        ^
 6      return 0;
 7  }
main.cpp:7:2: error: expected '}' at end of input

forループの{を閉じ忘れると、後続のコードがすべてループの中身として解釈されます。

直し方: (空) を } にします。

この問題を解いてみる →

パターン3

 1  #include <iostream>
 2  int main() {
 3      while (false) {
 4          std::cout << "no" << std::endl;
 5       
        ^
 6      return 0;
 7  }
main.cpp:7:2: error: expected '}' at end of input

g++は「to match this '{'」でどの開き括弧に対応する}が足りないかを教えてくれます。今回はwhileの開き括弧が対応不足です。

直し方: (空) を } にします。

この問題を解いてみる →

パターン4

 1  #include <iostream>
 2  int main() {
 3      int x = 5;
 4      if (x > 0) {
 5          std::cout << "positive" << std::endl;
 6       
        ^
 7      return 0;
 8  }
main.cpp:8:2: error: expected '}' at end of input

if文の{を閉じ忘れても同じ罠にかかります。ファイルの終わりまでブロックが閉じないままになります。

直し方: (空) を } にします。

この問題を解いてみる →

パターン5

 1  #include <iostream>
 2  int main() {
 3      {
 4          std::cout << "scoped" << std::endl;
 5       
        ^
 6      return 0;
 7  }
main.cpp:7:2: error: expected '}' at end of input

制御構文を伴わない、波括弧だけのブロックでも同じ罠にかかります。

直し方: (空) を } にします。

この問題を解いてみる →

よくある誤解

エラーは必ずファイルの最後の行を指しますが、実際に直すべき場所は閉じ忘れた{が開かれた場所です。g++は親切に「to match this '{'」と対応する開き括弧の位置も教えてくれるので、そこから探すのが近道です。

実務での勘所

プリプロセッサの#ifdef/#endifで一部のコードを無効化していると、この種のエラーが余計に見つけにくくなります。エディタの括弧の対応表示は#ifdefの条件を評価せず、ソースコード上に見えている{と}をすべて機械的に対応させるため、実際にコンパイルされる側とは違う組み合わせで「対応している」ように表示されることがあります。条件コンパイルが絡むコードで対応が合わないときは、有効になっている方の分岐だけを目で追う必要があります。

演習をはじめる

関連するエラー

広告
広告スロット(未設定)