error: '::main' must return 'int' の原因と直し方
main関数の戻り値の型をvoidにしてしまったときに出るエラーです。C++の標準では、main関数は必ずint型を返すと決められています。
エラーメッセージの読み方
main.cpp:2:1: error: '::main' must return 'int'
main.cpp- ファイル名
2- 行番号
1- 列番号 — この位置でg++が構文解析に失敗しました
'::main' must return 'int'- 内容 — 期待していたもの、または受け付けられなかったもの
このエラーが出る典型パターン
パターン1
1 #include <iostream> 2 void main() { ^ 3 std::cout << "start" << std::endl; 4 return 0; 5 }
main.cpp:2:1: error: '::main' must return 'int'
C++の標準ではmain関数は必ずint型を返すと決まっています。voidにするとコンパイルエラーになります。
直し方: void を int にします。
広告
広告スロット(未設定)
パターン2
1 #include <iostream> 2 void main() { ^ 3 int x = 1 + 1; 4 std::cout << x << std::endl; 5 return 0; 6 }
main.cpp:2:1: error: '::main' must return 'int'
C言語の一部の環境ではvoid main()が動くことがありますが、標準準拠を志向するg++では認められません。
直し方: void を int にします。
パターン3
1 #include <iostream> 2 void main() { ^ 3 std::cout << "end" << std::endl; 4 return 0; 5 }
main.cpp:2:1: error: '::main' must return 'int'
return 0;を書いていても、宣言部分のvoidが残っているとエラーになります。戻り値の型そのものをintに直す必要があります。
直し方: void を int にします。
パターン4
1 #include <iostream> 2 void main() { ^ 3 std::cout << "go" << std::endl; 4 return 0; 5 }
main.cpp:2:1: error: '::main' must return 'int'
C++の標準ではmain関数は必ずint型を返すと決まっています。
直し方: void を int にします。
パターン5
1 #include <iostream> 2 void main() { ^ 3 int y = 10; 4 std::cout << y << std::endl; 5 return 0; 6 }
main.cpp:2:1: error: '::main' must return 'int'
return 0;を書いていても、戻り値の型そのものをintに直す必要があります。
直し方: void を int にします。
よくある誤解
C言語の入門書や一部の環境では void main() が動いてしまうことがありますが、これは処理系の拡張であって標準ではありません。標準準拠を志向するg++では明確なコンパイルエラーになります。
実務での勘所
main関数には、C++の中でも特別な例外規定があります。他の一般的な関数では、戻り値の型がvoidでないのにreturn文を書かずに関数の終わりまで到達すると未定義動作になります。しかしmain関数だけは、return文を省略して終わりまで到達した場合、自動的にreturn 0;が実行されたのと同じ扱いになると規格で明記されています。この特例はmain関数だけに許された書き方で、他の関数では通用しません。