c++ - que - ¿Por qué int main(){} compila?
void main definicion (4)
Esto es parte del estándar de lenguaje C ++. Se genera un retorno 0 implícito si no hay una declaración de retorno explícita en main.
(Estoy usando Visual C ++ 2008) Siempre escuché que se requiere main () para devolver un entero, pero aquí no devolví return 0;
y compiló con 0 errores y 0 advertencias! En la ventana de depuración, dice que el programa ha salido con el código 0. Si esta función tiene otro nombre que no sea main (), el compilador se queja diciendo que ''blah'' debe devolver un valor. Hacer un return;
también hace que aparezca el error. Pero al dejarlo completamente fuera, compila muy bien.
#include <iostream>
using namespace std;
int main()
{
cout << "Hey look I''m supposed to return an int but I''m not gonna!/n";
}
¿Podría ser esto un error en VC ++?
Estoy bastante seguro de que VC ++ simplemente inserta un retorno 0 si no incluye uno en las funciones principales. Lo mismo puede suceder con las funciones, pero en esos casos, al menos, recibirá una advertencia.
La sección 6.6.3 / 2 establece que "Salir del final de una función es equivalente a un retorno sin valor, lo que da como resultado un comportamiento indefinido en una función que devuelve valor".
Un ejemplo es el siguiente código que, en el mejor de los casos, advierte sobre VS 2010 / g ++
int f(){
if(0){
if(1)
return true;
}
}
int main(){
f();
}
Entonces, el punto es que ''principal'' es especial como lo han señalado las respuestas anteriores.
3.6.1 Función principal
....
2 Una implementación no debe predefinir la función
main
. Esta función no debe estar sobrecargada. Tendrá un tipo de retorno de tipoint
, pero de lo contrario su tipo está definido por la implementación. Todas las implementaciones permitirán ambas de las siguientes definiciones de main:
int main() { /* ... */ }
y
int main(int argc, char* argv[]) { /* ... */ }
.... y continúa agregando ...
5 Una instrucción
return
enmain
tiene el efecto de dejar la función principal (destruir cualquier objeto con duración de almacenamiento automático) y llamar aexit
con el valor de retorno como argumento. Si el control llega al final demain
sin encontrar una instrucción return, el efecto es el de ejecutar return 0 ;
tratando de encontrar una copia en línea del estándar C ++ para poder citar este pasaje , encontré una publicación en el blog que cita todos los bits correctos mejor que pude.