2008-08-22 4 views
33

(J'utilise Visual C++ 2008) J'ai toujours entendu que main() est requis pour renvoyer 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 indique que le programme s'est terminé avec le code 0. Si cette fonction est nommée autre chose que main(), le compilateur se plaint de dire que 'blah' doit retourner une valeur. Coller un return; provoque également l'apparition de l'erreur. Mais en le laissant complètement, il compile bien.Pourquoi int main() {} compile?

#include <iostream> 
using namespace std; 

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

Cela peut-il être un bogue dans VC++?

Répondre

69

3.6.1 Fonction principale

....

2 Une mise en œuvre 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 mises en œuvre doivent permettre à la fois des définitions suivantes: principale

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

et

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

.... et il continue d'ajouter ...

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

essayant de trouver une copie en ligne du standard C++ pour que je puisse citer ce passage I found a blog post that quotes all the right bits better than I could.

+0

g ++ va vous lancer une erreur par défaut pour cela. la plupart des autres compilateurs font "return 0" à la place – wakingrufus

+3

Les anciennes versions de GCC renvoyaient des erreurs dans certains cas si vous n'aviez pas d'instruction return dans main(). –

+9

@wakingrufus, quelle version de g ++ utilisez-vous? Je reçois le bon comportement décrit par sparkes. – Kevin

3

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

+5

Il est un comportement indéfini pour tomber la fin d'une fonction non-vide. Seul le principal est spécial avec le retour implicite. –

17

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.

1

Section 6.6.3/2 Unis- « qui s'écoule la fin d'une fonction est équivalente à un retour sans value, ce qui entraîne un comportement indéfini dans une fonction de renvoi de valeur. ".

Un exemple est le code ci-dessous qui, au mieux Avertit sur VS 2010/g ++

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

int main(){ 
    f(); 
} 

Ainsi, le fait est que « principale » est spéciale que les réponses précédentes ont souligné.

Questions connexes