Risolvi il controllo raggiunge la fine dell'errore di funzione non nulla in C++
-
Utilizzare l’istruzione
return
alla fine del corpo della funzione -
Utilizzare le istruzioni
return
alla fine di ogni percorso del codice del corpo della funzione
Questo articolo spiegherà diversi metodi per risolvere il controllo che raggiunge la fine dell’errore di funzione non vuoto C++.
Utilizzare l’istruzione return
alla fine del corpo della funzione
Le funzioni non void devono avere un tipo restituito. Di conseguenza, la funzione deve avere un’istruzione che restituisca l’oggetto del tipo corrispondente. Se vengono passati determinati flag del compilatore, questo tipo di errore o avviso potrebbe essere completamente soppresso, il che porterà a errori in fase di esecuzione se la funzione data viene chiamata nel programma.
Il seguente codice di esempio ha la funzione reverseString
definita, che accetta un riferimento a una stringa e restituisce il valore della stringa. Se esaminiamo il corpo di una funzione, non esiste un’istruzione return
. Anche se reverseString
non passa alcun argomento alla funzione chiamante, il compilatore visualizza solo il messaggio di avviso e il programma eseguibile viene comunque compilato. Se la funzione viene chiamata, il flusso di controllo molto probabilmente porterebbe a un errore di segmentazione.
#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;
}
Utilizzare le istruzioni return
alla fine di ogni percorso del codice del corpo della funzione
Un altro scenario in cui il controllo raggiunge la fine di una funzione non void è quando i blocchi condizionali non hanno le istruzioni return
in ogni percorso. Quindi, se l’esecuzione nella funzione non void è ramificata e le istruzioni if
non coprono ogni possibile percorso, allora ci deve essere una chiamata esplicita return
alla fine del corpo della funzione.
L’esempio successivo mostra la funzione di manipolazione delle stringhe con due percorsi condizionali che passano il valore restituito alla funzione chiamante. Tuttavia, alcuni casi non vengono valutati per la condizione data, il che implica che il flusso di controllo potrebbe raggiungere la fine del blocco funzione e causare errori di runtime.
#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;
}
Probabilmente vedrai l’avviso di seguito.
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