Perché int main() {} viene compilato?
-
09-06-2019 - |
Domanda
(Sto usando Visual C++ 2008) Ho sempre sentito dire che main() lo è necessario per restituire un numero intero, ma qui non ho inserito return 0;
ed è stato compilato con 0 errori e 0 avvisi!Nella finestra di debug dice che il programma è terminato con il codice 0.Se questa funzione ha un nome diverso da main(), il compilatore si lamenta dicendo che 'blah' deve restituire un valore.Attaccare a return;
fa apparire anche l'errore.Ma lasciandolo completamente fuori, si compila perfettamente.
#include <iostream>
using namespace std;
int main()
{
cout << "Hey look I'm supposed to return an int but I'm not gonna!\n";
}
Potrebbe essere un bug in VC++?
Soluzione
3.6.1 Funzione principale
....
2 Un'attuazione non predefinisce il
main
funzione.Questa funzione non deve essere sovraccaricata.Deve avere un tipo restituito di tipoint
, ma per il resto il suo tipo è definito dall'implementazione.Tutte le implementazioni devono consentire entrambe le seguenti definizioni di main:int main() { /* ... */ }
E
int main(int argc, char* argv[]) { /* ... */ }
....e continua ad aggiungere...
5A
return
dichiarazione inmain
ha l'effetto di abbandonare la funzione principale (distruggere eventuali oggetti con durata di memorizzazione automatica) e chiamareexit
con il valore restituito come argomento. Se il controllo raggiunge la fine dimain
senza incontrare un'istruzione return, l'effetto è quello di eseguire return 0;
cercando di trovare una copia online dello standard C++ in modo da poter citare questo passaggio Ho trovato un post sul blog che cita tutte le parti giuste meglio di quanto avrei potuto.
Altri suggerimenti
Questo fa parte dello standard del linguaggio C++.Un ritorno implicito 0 viene generato per te se non c'è un'istruzione return esplicita in main.
Sono abbastanza sicuro che VC++ inserisce semplicemente un ritorno 0 se non ne includi uno nelle funzioni principali.La stessa cosa può succedere anche con le funzioni, ma in questi casi almeno riceverai un avviso.
La sezione 6.6.3/2 afferma: "Lo scorrimento dalla fine di una funzione equivale a un ritorno senza valore;ciò si traduce in un comportamento indefinito in una funzione che restituisce valore.".
Un esempio è il codice seguente che, nella migliore delle ipotesi, fornisce un avviso su VS 2010/g++
int f(){
if(0){
if(1)
return true;
}
}
int main(){
f();
}
Quindi il punto è che "principale" è speciale, come hanno sottolineato le risposte precedenti.