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++?
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 typeint
, 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é dansmain
a pour effet de laisser la fonction principale (détruire tous les objets avec une durée de stockage automatique) et appelerexit
avec la valeur de retour comme argument. si le contrôle atteint la fin demain
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.
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.
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.
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é.