Question

(J'utilise Visual C++ 2008) J'ai toujours entendu dire que main() est requis pour renvoyer un entier, mais ici je n'ai pas mis return 0; et et il a été compilé avec 0 erreur et 0 avertissement !Dans la fenêtre de débogage, il est indiqué que le programme s'est terminé avec le code 0.Si cette fonction est nommée autrement que main(), le compilateur se plaint en disant « bla » doit renvoyer une valeur.Coller un return; provoque également l'apparition de l'erreur.Mais en le laissant complètement de côté, il compile très bien.

#include <iostream>
using namespace std;

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

Serait-ce un bug dans VC++ ?

Était-ce utile?

La solution

3.6.1 Fonction principale

....

2 Une implémentation ne doit pas prédéfinir le main fonction.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 d'ajouter...

5 A return déclaration dans main a pour 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 de l'exécution de return 0;

j'essaie de trouver une copie en ligne du standard C++ afin de pouvoir citer ce passage J'ai trouvé un article de blog qui cite tous les bons éléments mieux que moi.

Autres conseils

Cela fait partie du standard du 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 presque sûr que VC++ insère simplement un retour 0 si vous n'en incluez pas dans les fonctions principales.La même chose peut également arriver avec les fonctions, mais dans ces cas-là, vous recevrez au moins un avertissement.

La section 6.6.3/2 indique : « S'écouler à la fin d'une fonction équivaut à un retour sans valeur ;cela se traduit par un comportement indéfini dans une fonction de retour de valeur.".

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

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

int main(){
   f();
}

Le problème est donc que « principal » est spécial, comme l'ont souligné les réponses précédentes.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top