5日連続で2つのビッグセール開催中!

【C/C++】C2561「関数が値を戻すように宣言されていますが、関数定義に’return’ステートメントがありません」の原因と対処法

2 min

プログラムをコンパイルしたらC2561コード「関数が値を戻すように宣言されていますが、関数定義に’return’ステートメントがありません」と表示されてコンパイルエラーになることがあります。

こちらは警告ではなくエラーであるため、解消するまでプログラムを実行することができません。

関数を実装しているはずなのに「関数が値を戻すように宣言されていますが、関数定義に’return’ステートメントがありません」と表示されてしまう問題について解説します。

C2561コードが発生する原因と対処法

C2561コードエラーが発生する原因はこれです。

値を返す関数(void型以外の関数)なのにreturn文で何も返していない

関数がvoid型であればreturn文で何も値を指定しなくても問題ないですが、int・doubleといったvoid以外だった場合は必ず何かしらの値を返す必要があります。

int func(int x)
{
    return;
}

上記コードはint型関数であるにも関わらずreturn;となっている(値を返さない)ため、C2561コードエラーとなります。void型以外にする場合は必ずなにかしら返す必要があるので覚えておきましょう。

何も値を返す必要がない関数を作ることは少ないので、今は何も返す値がなかったとしても、今後修正しやすいように以下のような0を返すint型関数にしておくといいでしょう。

int func(int x) {
    return 0;
}

void型だとプロトタイプ宣言の型など修正箇所が多くなってしまい、別のエラーの原因になってしまいますが、初めからint型関数にしておけば関数の実装部分を修正するだけで済みます。

例えば先ほど紹介したサンプルコードを以下のように改修する場合、初めからint型にしておくと修正が楽になります。

int func(int x)
{
    if (x < 0) {
        //負数なら-1を返す
        return -1;
    }
    //0以上なら0を返す
    return 0;
}

このようにvoid型より修正に強いので、将来的なことも考えてint型など何かしらの値を返す関数にしておくと良いでしょう。

C4715warningにも注意

コンパイルエラーにはなりませんが、C4715にも注意してください。C4715とは、関数の処理次第ではreturn文が実行されない可能性がある場合に表示される警告メッセージです。

int func(int x)
{
    if (x < 0) {
        return -1;
    }
}

例えば上記コードは引数がマイナスの値なら-1を返すようになっていますが、正数だった場合に実行されるreturn文がありません。

この場合はおかしな値が返されてしまって不具合の原因になるので注意してください。