C言語・C++でプログラムを書いていくにおいて、たくさん関数を定義・実装していくことになると思いますが、一気に関数を実装しようとしたときにC2561「関数が値を戻すように宣言されていますが、関数定義に’return’ステートメントがありません」というエラーを見かけることがあります。
今回は、うっかりやってしまいがちなC2561エラーについて原因や対処法を解説していきます。
C2561エラー「関数が値を戻すように宣言されていますが、関数定義に’return’ステートメントがありません」の元と対処法
C2561エラーでコンパイル・ビルドに失敗してしまう原因は一つ。return文で返す値を書き忘れていることが原因です。
int check(int a){
if (a > 100) {
return; //C2561
}
return 0;
}
上記のサンプルプログラムのcheck関数を見てみましょう。
関数末尾のreturn文は0を返すように書けていますが、if文内のreturn文では返す値を書き忘れています。
void型関数以外の関数でreturn文を書くときは、必ず値を返す必要があるため、一つでも返り値の記述漏れが起きていたらC2561エラーが発生してしまいます。
int check(int a){
if (a > 100) {
return 1; //OK
}
return 0;
}
return文を書くときはちゃんと返り値まで指定してあげるようにしましょう。
関数の型をvoidから変えたときにやってしまいやすい
最初は値を返さないvoid型関数として書いていたけど、途中から返り値を変えしたくなってvoid型から別の方に変更することがあります。
こういうとき、型を変更した関数内のreturn文を全て修正する必要があるのですが、if文内のreturn文などを見落としがちです。
返り値が不要な関数でも、仕様変更が起きるかもしれないということを想定して、int型関数にしておくことをおすすめします。return文が全てreturn 0;
でも問題ないので、なんでもかんでもvoid func(){}
のようにvoid型関数にすることはやめておきましょう。
C2561エラーが起きたらreturn文を見直すこと
C2561エラーは関数内のreturn文で返り値を書き忘れていることが原因なので、表示されたコンパイルエラーの行を確認して修正していきましょう。
Visual Studioならエラー分をダブルクリックするだけでC2561エラーなどコンパイルエラーの行へとすぐに移動できるので、覚えておくと便利です。
void型の関数では値を返さないように
余談ですが、void型の関数のままreturn 1;
のように値を返すreturn文を書いてしまうと、C2562エラーが発生します。
void型関数は絶対に値を返さない、それ以外の関数は関数の型に合わせて返り値をreturn文で返すようにしてください。
C2561エラーを用いた応用テクニック
頻繁にビルド・コンパイルできる環境だった場合、C2561エラーが起きる前提で関数を書いていく方法もあります。
- 実装する関数内で、return文を記述する予定の場所全てに
return;
を一旦書いておく - コンパイル・ビルドする
- void型関数じゃなければ必ずコンパイルエラーになるので、エラー行を見てピンポイントでreturn文を順番に正しいものに書き換えていく
ちょっとしたテクニックですが、return文で返す値(フラグ値など)が未定だった場合、return文だけでも書いておくといいかもしれません。
誰かとプログラムを共有する場合はreturn文のエラーを放置したまま共有するのはできるだけ避けましょう。共有された側がビルドするときに困ってしまいます
返す値が未定だった場合、コンパイルエラーを応用して効率化するテクニックもあるので、使えそうな場面では使ってみるといいでしょう。