Main() est-il vraiment le début d'un programme C ?
La norme C indique dans la section $3.6.1/1 que chaque programme doit inclure une fonction globale nommée main, qui lui sert de point de départ désigné. Cependant, un scénario se présente dans lequel cette affirmation semble être contestée.
Considérez l'exemple de 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 remplit avec succès son objectif en imprimant les carrés d'entiers de 0 à 9 avant d'entrer dans la fonction main(). Curieusement, le code se compile sans erreurs ni avertissements lors de l'utilisation de l'indicateur -pedantic dans GCC 4.5.0.
Cette observation soulève des questions sur l'affirmation du Standard selon laquelle main() est le point de départ du programme. Le code semble exécuter des fonctions définies par l'utilisateur avant d'entrer dans le point de départ désigné.
La définition de « Démarrer »
Le différend repose sur la définition précise de « Début » début du programme." La Norme ne définit pas explicitement ce terme, laissant place à l’interprétation. Certains diront que "start" implique l'exécution initiale du code, qui dans ce cas se produit dans user_main(). D'autres peuvent soutenir que « début » fait référence au point de départ désigné tel que défini par les spécifications du langage.
La distinction clé réside dans l'interprétation de la phrase du standard C :
Un programme doit contenir un fonction globale appelée main, qui est le début désigné du programme.
La norme définit essentiellement le terme « début » dans le contexte de la norme elle-même. Il n'affirme pas qu'aucun code n'est exécuté avant l'appel de main(). Au lieu de cela, il établit main() comme point de départ désigné du programme pour toutes les discussions et définitions ultérieures.
Sur la base de cette interprétation, l'exemple de code fourni reste conforme à la norme C. La fonction user_main() s'exécute avant le "démarrage" du programme tel que défini par le Standard. Cette exécution préalable n'invalide pas le point de départ désigné du programme à main().
Par conséquent, la conclusion est que main() conserve sa désignation de point de départ d'un programme C, même si le code défini par l'utilisateur peut s'exécuter avant que ce point de départ désigné ne soit atteint. La définition de « début » dans la Norme clarifie cette compréhension.
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!