HOWTO · C++
Resolver o Controlo Atinge o Fim do Erro da Função Não-Voidiana em C++
Este artigo demonstra como resolver o controlo chega ao fim do erro de função nãovoid em C++
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.