¿Por qué compila int main () {}?


(Estoy usando Visual C++ 2008) Siempre he escuchado que main () es requerido para devolver un 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 se llama cualquier otra cosa que no sea main(), el compilador se queja diciendo ' bla ' debe devolver un valor. Pegar un return; también hace que aparezca el error. Pero dejándolo fuera por completo, compila solo fino.

#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 un error en VC++?

Author: Helen, 2008-08-22

4 answers

3.6.1 Función principal

....

2 Una implementación no predefinirá la función main. Esta función no se sobrecargará. Tendrá un tipo de retorno de type int, pero por lo demás su tipo está definido por la implementación. Todas las implementaciones permitirán las dos definiciones siguientes de main:

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

Y

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

.... y sigue sumando ...

5 Una declaración return en main tiene el efecto de dejar la función principal (destruyendo cualquier objeto con duración de almacenamiento automática) y llamando a exit con el valor devuelto como argumento. Si control llega al final de main sin encontrar una sentencia return, el efecto es el de ejecutar return 0;

Tratando de encontrar una copia en línea del estándar C++ para que pudiera citar este pasaje Encontré una entrada de blog que cita todos los bits correctos mejor de lo que pude.

 69
Author: sparkes,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-10-08 15:18:53

Esto es parte del estándar del lenguaje C++. Se genera un retorno implícito 0 si no hay una declaración de retorno explícita en main.

 17
Author: On Freund,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-08-22 12:52:03

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 también, pero en esos casos al menos obtendrás una advertencia.

 3
Author: bradtgmurray,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-08-22 12:51:49

La sección 6.6.3/2 establece: "Fluir fuera del final de una función es equivalente a un retorno sin valor; esto resulta en un comportamiento indefinido en una función de retorno de valor.".

Un ejemplo es el código a continuación que en el mejor de los casos da una advertencia sobre VS 2010 / g++

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

int main(){
   f();
}

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

 1
Author: Chubsdad,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-08-16 11:20:18