Fehler Control Reaches End of Non-Void Function in C++ beheben

Jinku Hu 12 Oktober 2023
  1. Verwendung von die Anweisung return am Ende des Funktionskörpers
  2. Verwendung von die return-Anweisungen am Ende jedes Codepfades des Funktionskörpers
Fehler Control Reaches End of Non-Void Function in C++ beheben

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.
Autor: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

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

Verwandter Artikel - C++ Function