La section $ 3.6.1 / 1 du standard C ++ lit,
Un programme doit contenir une fonction globale appelée main , qui est le début désigné du programme.
Considérons maintenant ce code,
int square(int i) { return i*i; }
int user_main()
{
for ( int i = 0 ; i < 10 ; ++i )
std::cout << square(i) << endl;
return 0;
}
int main_ret= user_main();
int main()
{
return main_ret;
}
Cet exemple de code fait ce que je compte faire, c'est-à-dire imprimer le carré des nombres entiers de 0 à 9, avant d' entrer dans la main()
fonction qui est censée être le "début" du programme.
Je l'ai également compilé avec l' -pedantic
option, GCC 4.5.0. Cela ne donne aucune erreur, pas même d'avertissement!
Donc ma question est,
Ce code est-il vraiment conforme à la norme?
S'il est conforme à la norme, cela n'invalide-t-il pas ce que dit la norme? main()
n'est pas le début de ce programme! user_main()
exécuté avant le main()
.
Je comprends que pour initialiser la variable globale main_ret
, le use_main()
exécute en premier, mais c'est une chose complètement différente; le point est que, il n'annule la déclaration citée $ 3.6.1 / 1 de la norme, comme n'est pas le début du programme; c'est en fait la fin de ce programme!main()
ÉDITER:
Comment définissez-vous le mot «commencer»?
Cela se résume à la définition de l'expression «début du programme» . Alors, comment le définissez-vous exactement?
main()
comme "début du programme"