Pourquoi ne int main() {} compiler?

(J'utilise Visual C++ 2008) j'ai toujours entendu dire que main () est requis pour retourner un entier, mais ici je n'ai pas mis return 0; et et il compilé avec 0 erreurs et 0 Avertissements! Dans la fenêtre de débogage, il est indiqué que le programme est sorti avec le code 0. Si cette fonction est nommée autre chose que main(), le compilateur se plaint en disant 'blah' doit retourner une valeur. Coller un return; provoque également l'erreur. Mais en le laissant complètement, il compile juste fin.

#include <iostream>
using namespace std;

int main()
{
    cout << "Hey look I'm supposed to return an int but I'm not gonna!n";
}

Cela pourrait - il être un bug dans VC++?

33
demandé sur Helen 2008-08-22 16:49:37

4 réponses

3.6.1 fonction Principale

....

2 une implémentation ne doit pas prédéfinir la fonction main. Cette fonction ne doit pas être surchargée. Il doit avoir un type de retour de type int, mais sinon son type est défini par l'implémentation. Toutes les implémentations doivent permettre les deux définitions suivantes de main:

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

Et

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

.... et il continue à ajouter ...

5 return énoncé dans main a pour effet de laisser la fonction principale (détruire tous les objets avec une durée de stockage automatique) et appeler exit avec la valeur de retour comme argument. si le contrôle atteint la fin de main sans rencontrer une instruction return, l'effet est celui de l'exécution return 0;

En essayant de trouver une copie en ligne de la norme C++ afin que je puisse citer ce passage j'ai trouvé un article de blog qui cite tous les bons bits mieux que je pouvais.

69
répondu sparkes 2015-10-08 15:18:53

Cela fait partie de la norme de langage C++. Un retour implicite 0 est généré pour vous s'il n'y a pas d'instruction de retour explicite dans main.

17
répondu On Freund 2008-08-22 12:52:03

Je suis sûr que VC++ insère juste un retour 0 si vous n'en incluez pas un dans les fonctions principales. La même chose peut arriver avec les fonctions aussi, mais dans ces cas au moins, vous obtiendrez un avertissement.

3
répondu bradtgmurray 2008-08-22 12:51:49

La Section 6.6.3 / 2 stipule - " S'écouler à la fin d'une fonction équivaut à un retour sans valeur; cela entraîne un comportement indéfini dans une fonction de retour de valeur.".

Un exemple est le code ci-dessous qui au mieux donne un avertissement sur VS 2010 / G++

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

int main(){
   f();
}

Donc, tout le problème est que 'main' est spécial comme les réponses précédentes l'ont souligné.

1
répondu Chubsdad 2010-08-16 11:20:18