Resolver o Controlo Atinge o Fim do Erro da Função Não-Voidiana em C++
-
Utilizar a declaração
return
no fim do corpo da função -
Utilize as declarações de
return
no fim de cada caminho de código do corpo da função
Este artigo irá explicar vários métodos de resolução de controlo que chegam ao fim do erro de função não ovóide C++.
Utilizar a declaração return
no fim do corpo da função
As funções não ovóides são necessárias para ter um tipo de retorno. Consequentemente, a função precisa de ter uma declaração que devolva o objecto do tipo correspondente. Se determinadas bandeiras do compilador forem passadas, este tipo de erro ou aviso pode ser totalmente suprimido, o que levará a falhas de tempo de execução se a função em questão for chamada no programa.
O seguinte código de exemplo tem a função reverseString
definida, que toma uma referência a uma string e retorna o valor da string. Se olharmos para um corpo de função, não há declaração de return
. Embora o reverseString
não passe quaisquer argumentos para a função chamadora, o compilador apenas exibe a mensagem de aviso, e o programa executável é construído de qualquer forma. Se a função for chamada, então o fluxo de controlo muito provavelmente conduziria a uma falha de segmentação.
#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;
}
Utilize as declarações de return
no fim de cada caminho de código do corpo da função
Outro cenário em que o controlo chega ao fim de uma função não ovóide é quando os blocos condicionais não têm as declarações de return
em todos os caminhos. Assim, se a execução na função não ovóide for ramificada e as declarações if
não cobrirem todos os caminhos possíveis, então é necessário que haja uma chamada explícita de return
no fim do corpo da função.
O exemplo seguinte demonstra a função de manipulação de string com dois caminhos condicionais que passam o valor de retorno para a função de chamada. No entanto, alguns casos não são avaliados para a condição dada, o que implica que o fluxo de controlo pode chegar ao fim do bloco de função e causar erros de tempo de execução.
#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;
}
É possível que se veja o aviso abaixo.
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