Main() est-il vraiment le point de départ d'un programme C ?
La norme C, dans la section 3.6.1/1, déclare qu'un programme doit posséder une fonction globale nommée main, qui sert de point de départ désigné. Cependant, une analyse plus approfondie et un exemple de code illustratif ont remis en question la validité de cette déclaration.
Considérez le code suivant :
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; }
Ce code atteint son objectif : il affiche les carrés d'entiers de 0 à 9. Cependant, l'aspect déroutant réside dans le fait que la fonction user_main() s'exécute avant main(), qui est censée être le point de départ du programme. La compilation de ce code avec l'option -pedantic à l'aide de GCC 4.5.0 ne génère aucune erreur ni avertissement.
Cette observation soulève la question : ce code est-il conforme à la norme ?
Pour répondre à cette question, nous devons approfondir le sens de l'expression « début du programme ». La Norme définit ce terme spécifiquement pour le contexte de la Norme elle-même. Il n'affirme pas qu'aucun code ne peut s'exécuter avant main(). Au lieu de cela, il établit que le début du programme est le point auquel main() commence.
Dans le cas de cet exemple de code, user_main() s'exécute avant le "démarrage" du programme, selon la définition fournies par la norme. Par conséquent, ce code est entièrement conforme. De par sa conception, un code important s'exécute souvent avant l'appel de main(), y compris dans cet exemple.
Par conséquent, l'idée fausse découle d'une mauvaise interprétation de la définition de la norme. Pour le bien des discussions du Standard, user_main() est exécuté avant le « démarrage » du programme, et ce comportement reste entièrement conforme au Standard.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!