2008-08-22 24 views
33

(Estoy usando Visual C++ 2008) Siempre he oído que main() es requerido para devolver un número entero, pero aquí no puse 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. Al aplicar un return;, también aparece el error. Pero al dejarlo completamente fuera, compila muy bien.¿Por qué int main() {} compila?

#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++?

Respuesta

69

3.6.1 Función principal

....

2 Una implementación no se predefinir la función main. Esta función no debe estar sobrecargada. Tendrá un tipo de devolución del tipo int, pero de lo contrario su tipo está definido por la implementación. Todas las implementaciones permitirán ambas de las siguientes definiciones de principal:

int main() { /* ... */ } 

y

int main(int argc, char* argv[]) { 
/* ... */ 
} 

.... y sigue sumando ...

5 Un return declaración en main tiene el efecto de dejar la función principal (destruir cualquier objeto con duración de almacenamiento automático) y llamar al exit con el valor de retorno como argumento. Si el control llega al final de main sin encontrar una declaración de devolución, el efecto es el de ejecutar return 0;

tratando de encontrar una copia en línea del estándar C++ por lo que podría citar este pasaje I found a blog post that quotes all the right bits better than I could.

+0

g ++ arrojará un error por defecto para hacer esto. la mayoría de los demás compiladores "devuelven 0" en su lugar – wakingrufus

+3

Las versiones anteriores de GCC realmente devolvieron basura en algunos casos si no tenía una declaración de devolución en main(). –

+9

@wakingrufus, ¿qué versión de g ++ estás usando? Obtengo el comportamiento correcto descrito por Sparkes. – Kevin

3

Estoy bastante seguro de que VC++ solo 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.

+5

Es un comportamiento indefinido caer al final de una función no nula. Solo main es especial con retorno implícito. –

17

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.

1

Sección 6.6.3/2 Unidos- "que fluye fuera de la final de una función es equivalente a un retorno sin valor; esto da como resultado un comportamiento indefinido en una función que devuelve valor ".

Un ejemplo es el código de abajo que en el mejor notifica, en VS 2010/g ++

int f(){ 
    if(0){ 
     if(1) 
     return true; 
    } 
} 

int main(){ 
    f(); 
} 

Así que el punto es que la 'principal' es especial ya que las respuestas anteriores han señalado.