Fehler Control Reaches End of Non-Void Function in C++ beheben
-
Verwendung von die Anweisung
return
am Ende des Funktionskörpers -
Verwendung von die
return
-Anweisungen am Ende jedes Codepfades des Funktionskörpers
In diesem Artikel werden mehrere Methoden zur Lösung des Fehlers control reaches end of non-void function
in C++ erläutert.
Verwendung von die Anweisung return
am Ende des Funktionskörpers
Nicht-voide Funktionen müssen einen Rückgabetyp haben. Folglich muss die Funktion eine Anweisung haben, die das Objekt des entsprechenden Typs zurückgibt. Wenn bestimmte Compiler-Flags übergeben werden, wird diese Art von Fehler oder Warnung möglicherweise ganz unterdrückt, was zu Laufzeitfehlern führt, wenn die angegebene Funktion im Programm aufgerufen wird.
Im folgenden Beispielcode ist die Funktion reverseString
definiert, die eine Referenz auf eine Zeichenkette entgegennimmt und den String-Wert zurückgibt. Wenn wir einen Blick in den Funktionskörper werfen, gibt es keine return
-Anweisung. Obwohl die Funktion reverseString
keine Argumente an die aufrufende Funktion übergibt, zeigt der Compiler nur die Warnmeldung an, und das ausführbare Programm wird trotzdem erstellt. Wenn die Funktion aufgerufen wird, dann würde der Kontrollfluss höchstwahrscheinlich zu einem Segmentierungsfehler führen.
#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;
}
Verwendung von die return
-Anweisungen am Ende jedes Codepfades des Funktionskörpers
Ein weiteres Szenario, bei dem die Kontrolle das Ende einer nicht-voiden Funktion erreicht, ist, wenn die bedingten Blöcke nicht in jedem Pfad die return
-Anweisungen enthalten. Wenn also die Ausführung in der Non-Void-Funktion verzweigt ist und die if
-Anweisungen nicht jeden möglichen Pfad abdecken, muss es einen expliziten return
-Aufruf am Ende des Funktionskörpers geben.
Das nächste Beispiel demonstriert die Funktion zur Zeichenkettenmanipulation mit zwei bedingten Pfaden, die den Rückgabewert an die aufrufende Funktion übergeben. Allerdings werden einige Fälle für die gegebene Bedingung nicht ausgewertet, was bedeutet, dass der Kontrollfluss möglicherweise das Ende des Funktionsblocks erreicht und Laufzeitfehler verursacht.
#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;
}
Möglicherweise wird die folgende Warnung angezeigt.
Main.cpp:15:1: warning: non-void function does not return a value in all control paths [-Wreturn-type]
}
^
1 warning generated.
Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.
LinkedIn Facebook