C++ で非ボイド関数エラーの終了に達する制御を解決する
胡金庫
2023年10月12日
この記事では、制御が非ボイド関数の終了に達するエラーを解決するためのいくつかの方法を説明します。
関数本体の最後に return
文を使用する
非ボイド関数は、戻り値の型を持つことが要求されます。その結果、関数は対応する型のオブジェクトを返す文を持つ必要があります。特定のコンパイラフラグが渡されると、このタイプのエラーや警告が完全に抑制されてしまい、プログラム内で指定された関数が呼び出された場合に実行時エラーが発生する可能性があります。
以下のコード例では、reverseString
関数が定義されており、これは文字列への参照を受け取り文字列の値を返します。関数本体を見てみると、return
文はありません。reverseString
は呼び出し元の関数に引数を渡さないにもかかわらず、コンパイラは警告メッセージを表示するだけで、実行プログラムはとにかくビルドされます。関数が呼び出された場合、制御フローがセグメンテーションフォールトを起こす可能性が高いです。
#include <algorithm>
#include <iostream>
#include <iterator>
using std::cout;
using std::endl;
using std::reverse;
using std::string;
string reverseString(string &s) { string rev(s.rbegin(), s.rend()); }
int main() {
string str = "This string is arbitrary";
int cond = -1;
cout << str << endl;
cout << reverseString(str, cond) << endl;
return EXIT_SUCCESS;
}
関数本体の各コードパスの最後に return
文を使用してください
制御が非ボイド関数の最後に到達するもう一つのシナリオは、条件ブロックがすべてのパスに return
文を持たない場合です。したがって、非ボイド関数の実行が分岐していて if
文がすべての可能なパスをカバーしていない場合、関数本体の最後に明示的な return
呼び出しが必要になります。
次の例では、戻り値を呼び出し元の関数に渡す 2つの条件付きパスを持つ文字列操作関数を示します。しかし、与えられた条件が評価されないままになっているケースもあります。これは、制御フローが関数ブロックの最後まで到達し、ランタイムエラーが発生する可能性があることを意味します。
#include <algorithm>
#include <iostream>
#include <iterator>
using std::cout;
using std::endl;
using std::reverse;
using std::string;
string reverseString(string &s, int condition) {
if (condition == -1) {
string rev(s.rbegin(), s.rend());
return s;
} else if (condition == 0) {
return s;
}
}
int main() {
string str = "This string is arbitrary";
int cond = -1;
cout << str << endl;
cout << reverseString(str, cond) << endl;
return EXIT_SUCCESS;
}
以下の警告が表示される可能性があります。
Main.cpp:15:1: warning: non-void function does not return a value in all control paths [-Wreturn-type]
}
^
1 warning generated.
著者: 胡金庫