2010-05-06 28 views
16

Il mio libro My Herb Schildt su C++ dice: "... In C++, se una funzione viene dichiarata come restituendo un valore, è restituire un valore". Tuttavia, se scrivo una funzione con un tipo di reso non vuoto e non restituisco nulla, il compilatore emette un avvertimento invece di un errore: "Il controllo raggiunge la fine della funzione non void."Una dichiarazione di ritorno è obbligatoria per le funzioni C++ che non restituiscono nulla?

Io uso gcc (MinGW) e ho impostato il flag -pedantic.

+17

Ho sentito che i libri Herb Schildt sono cattivi. –

+8

Sì, è obbligatorio. Inoltre, pensa di ottenere un libro migliore. La maggior parte dei libri di Schildt sono generalmente considerati cattivi. – sellibitze

+0

Ecco perché io compilo con '-Werror' ... –

risposta

3

Sì, deve restituire un valore.

Flowing off the end of a function is equivalent to a return with no value; this results in undefined behavior in a value-returning function.

This question porterà più luce al soggetto

+0

Grazie mille. Lo vedo come una minutia filosofica ora. Per "must", lo standard significa "deve, o il comportamento sconosciuto ne consegue". – AlwaysLearning

1

E 'obbligatorio? Non credo, ma non restituire un valore in una funzione di restituzione non vuota è indefinito, come per la mia comprensione degli standard C++ (eccetto per main, che restituisce 0).

Significa che è OK? Probabilmente no - se si suppone che la funzione restituisca un valore, si dovrebbe restituirne uno, che potrebbe diventare molto complicato in basi di codice complesse.

24

§6.6.3/2:

Flowing off the end of a function is equivalent to a return with no value; this results in undefined behavior in a value-returning function.

quindi dipende dalla vostra definizione di obbligatorio. Lo ha? No. Ma se vuoi che il tuo programma abbia un comportamento ben definito, sì. *

* main è un'eccezione, vedere §3.6.1/5. Se il controllo raggiunge la fine di main senza uno return, avrà l'effetto di return 0;.

+4

Il comportamento indefinito è di gran lunga peggiore di un arresto anomalo. –

+2

@Jurily: Sono d'accordo, ma non vedo come sia collegato a qualcosa qui. – GManNickG

+1

Nota la dicitura: si applica all'esecuzione, non alla compilazione. Se si immette una funzione con un tipo di ritorno diverso da 'void' e non scorre alla fine, non è necessario un' return' per evitare un comportamento indefinito. –

9

È obbligatorio: è un comportamento non definito quando tale funzione termina senza restituire nulla (in questo modo i compilatori potrebbero effettivamente implementare un tipo di comportamento speciale). Tuttavia, ci sono alcuni casi speciali.

::main è un'eccezione, si presume che return 0; sia alla fine del suo codice.

Inoltre, non è necessario restituire un valore in una funzione che non restituisce in modo pulito, fe:

int Foo() { 
    throw 42; 
} 
+3

L'esempio di eccezione è probabilmente il motivo per cui questo è solo un avvertimento. I compilatori non sono molto bravi a sapere quali percorsi di controllo sono effettivamente utilizzati e un errore comporterebbe il rifiuto di un codice molto buono. –

6

Non è obbligatorio avere un'istruzione return in una funzione dichiarata in modo da restituire non-vuoto e non deve condurre a un comportamento indefinito.

Tale funzione potrebbe:

  • non ritorno, diciamo inserendo un ciclo infinito
  • Rientro un'eccezione
  • chiamata una funzione che si non restituisce, come std::terminate

Ovviamente, se una funzione evita il comportamento indefinito eseguendo sempre uno dei precedenti, probabilmente non dovrebbe essere dichiarata come non valida se possibile.

Un caso evidente dove sarebbe necessario è se si tratta di una funzione virtuale che un punto particolare in una gerarchia di classi non può restituire un valore valido e sempre esce tramite un'eccezione.

0

Se si dimentica di includere un'istruzione return in un percorso di controllo di una funzione di ritorno valore, il codice non viene formattato correttamente. Cioè normalmente dovresti aspettarti la compilazione del codice (magari con un avvertimento). In questo senso non è "obbligatorio".

Tuttavia, in realtà scorre fuori dall'estremità della funzione valore-ritorno in C++ è sempre comportamento indefinito. (In C è un comportamento indefinito solo se il codice chiamante utilizza effettivamente il risultato.)

0

Come il GMAN detto l'unica eccezione è la funzione principale. Vedo ancora tonnellate di libri che restituiscono 0 in main che non è veramente necessario. Oh beh immagino che potrebbe essere peggio e potresti imparare da un libro che usa void main() invece di int main(). Ma penso che ciò che si dovrebbe imparare da tutto questo è che il compilatore si lamenta per un motivo ed è buono hai preso nota di esso dal momento che di solito risparmiare mal di testa nel lungo periodo.

Problemi correlati