la fonction main() en C
J'ai été l'apprentissage de la programmation en C dans un autodidacte de la mode depuis quelques semaines, et il ya quelques questions que j'ai concernant la main()
fonction.
-
Toutes les fonctions doivent être déclarées dans leur prototype de fonction, et plus tard, dans leur définition. Pourquoi n'avons-nous pas à déclarer la
main()
fonction d'abord un prototype? -
Pourquoi devons-nous utiliser
int main()
au lieu devoid main()
? -
Ce n'return 0 exactement dans le
main()
fonction? Qu'arriverait-il si j'ai écrit un programme se terminant lemain()
fonction avecreturn 1;
, par exemple?
main()
a même son propre Wikipédia- 1) est incorrect, le prototype n'est pas un "must"
- Heads up, " autour de ces pièces, nous aimons garder chaque question à une seule question à la fois. Donc, votre poste sonne comme trois questions. Si vous trouverais beaucoup de écrit à propos de la deuxième déjà, comme stackoverflow.com/questions/9356510/int-main-vs-void-main-in-c
- Vous pouvez obtenir la valeur renvoyée par votre programme avec
$?
sur les systèmes unix (doit être quelque chose d'autre sur Windows) :./myprog && echo $?
- sur Windows avec cmd.exe c'est %errorlevel% IIRC.
- bon à savoir ! Merci.
- Si vous utilisez
&&
dans cette construction,echo
ne fonctionnera pas à moins que$?
est égale à zéro. - La chose drôle est, sur la plupart des systèmes, la grande majorité des numéros de
main()
peut de retour ne sont pas retournés correctement car le système d'exploitation prend en charge uniquement un sous-ensemble (comme 0 - 255 ou quelque chose de stupide). J'ai l'habitude de simplement me limiter à 0 et 1, ou peut-être un peu plus. - Au lieu de renvoyer 0, de la main, il serait sage, si vous utilisez la macro prédéfinie pour le même, à partir de
stdlib.h
, qui estreturn EXIT_SUCCESS;
, car cela permettra d'élargir à un système dépendant de l'intégrale de l'expression 🙂
Vous devez vous connecter pour publier un commentaire.
void main
, mais c'est un non-extension standard (généralement, cela veut dire "toujours le retour à zéro de l'OS").main
ne doit pas être appelée à partir de n'importe quelle autre fonction. La Clause 5.1.2.2.3 inclut même une référence à “l'appel initial à lamain
fonction,” reconnaissant ainsi la possibilité de les appels suivants. Il n'existe aucune règle que si une fonction,main
ou autre, ne doit pas être appelée à partir de n'importe quelle autre fonction pour une raison quelconque, il ne doit pas être déclarée.main
]” pourrait causer de la confusion, mais cela signifie juste que le C de la mise en œuvre ne permet pas de fournir une déclaration. C'est, il n'est pas intégrée dans le compilateur ou l'une quelconque des en-têtes standard. Cela ne signifie pas que le programme peut ne pas déclarer un prototype pourmain
.Pas vrai. Exemple Simple:
Uniquement lorsqu'une fonction est appelée, mais la définition n'est pas encore vu, une déclaration est requise. Qui n'arrivera jamais à
main
puisque c'est le starup du programme.Parce que la norme dit. (Pour être plus précis, c'est vrai que sur un environnement hébergé, ce qui est généralement le cas)
La valeur de retour indique le résultat du programme. Généralement
0
indique la réussite, tandis que d'autres valeurs indique les différents types de défaillance.Vous n'êtes pas libre de choisir le type de retour de main parce que vous n'avez pas à écrire le code qui appelle principale. Le code appelant principal existait déjà avant même de la pensée sur l'apprentissage C. Il a été écrit par les gens de fournir le C runtime code de démarrage, qui est généralement lié automatiquement à votre exécutable, sans le savoir. Ce code réside souvent dans un fichier appelé crt0.o (créé à partir de crt0.c assembleur, voire dans crt0.s). Il s'attend à utiliser une valeur de retour indiquant la réussite (0) ou l'échec (différente de zéro), plus éventuellement d'autres informations telles que le code a été annulée en raison d'un signal et, si oui, lequel. Ces sont des bits d'Unix histoire, que je ne répéterai pas ici 🙂
1) Pas nécessairement; une définition sert également une déclaration. Deuxièmement, il y a seulement quelques signatures valides pour
main
de toute façon, et vous ne sera pas normalement appelmain
dans votre code, sauf si vous écrivez une entrée pour l'IOCCC.2) réponse Courte: parce que la définition du langage le dit. Plus réponse: c'est la façon dont votre programme indique la réussite ou l'échec à l'environnement hôte. Un individu de la mise en œuvre est libre de prendre en charge d'autres signatures pour
main
, mais il doit documenter ces signatures supplémentaires. Si votre documentation du compilateur ne fait pas de listevoid main()
comme une signature légale, alors vous ne devriez pas l'utiliser.3) de la convention (au moins sur les systèmes *nix, où C a d'abord été utilisé), une valeur de 0 indique la réussite, et un état différent de zéro indique ... quelque chose d'autre que de succès. Exactement ce que la valeur correspond à ce que l'état est, jusqu'à la mise en œuvre.
1) c'est faux, vous ne pouvez créer la définition d'une fonction.
2) nous ne pouvons savoir si la fonction main() correctement résilier
3)de la même sauf que dans votre coquille, il sera écrits 1 au lieu de 0
1.La fonction main() est automatiquement appelée par la bibliothèque C par la reconnaissance de la clé principale. Donc, nous n'avons pas besoin de déclarer un prototype de la fonction principale .
2.Ce que je ne suis pas sûr, mais je pense que cela dépend du type de l'éditeur . En Turbo C , void main() ne sera accepté, alors que dans dev-cpp main() doit retourner une valeur.
3.return 0 simplement quitte le programme avec un code de sortie 0 , en d'autres termes, la valeur de retour détermine le statut de sortie du thread principal.
Simplement mettre plus d'essence pour toutes vos questions, ce sont des traditions et de la conformité.
Toolchains, systèmes d'exploitation, etc sais que la manière que cette procédure appelée main () doit être appelée d'abord à partir de l'utilisateur code de l'espace(programme)...
Maintenant plus précisément:
1) en Raison de la conformité comme je l'ai dit. Vous n'avez pas besoin de déclarer en raison toolchains et les systèmes d'exploitation savez déjà au sujet principal. Il existe également d'autres la conformité des fonctions comme exit().
2) Lorsque le principal certain temps renvoie ensuite le système d'exploitation peut avoir pour effet de recul. Généralement non de zéro signifie l'erreur. Ainsi, lorsque U à l'aide de scripts ou d'autres programmes d'appeler votre programme de par exemple la fonction main (), vous pouvez vérifier si elle a réussi.
3) le Retour de quelque chose d'autre que zéro signifie l'erreur. Mais en fait, on peut interpréter cette valeur comme vous le souhaitez. Mais comme je l'ai dit OS peut avoir le résultat.
Infos supplémentaires:
main() est en fait pas LA PREMIÈRE fonction (que vous avez écrit) qui sera appelé lorsque vous démarrez le programme. MAIS en réalité, les systèmes d'exploitation et les chaînes d'outils de faciliter d'autres appels avant de votre main, à l'environnement d'installation, effectuez l'initialisation ou quoi que ce soit. Mais vous ne savez pas à ce sujet directement lorsque vous écrivez votre code et que vous n'avez pas à traiter avec que et de penser à ce sujet. Dans les systèmes embarqués, il y aura généralement un très faible niveau de fonctions appelé à la configuration de la CPU principale de l'horloge, les interruptions, pile, etc. Certains des chaînes d'outils comme IAR effectivement peut vous permettre de réaliser votre propre code avant de principal est appelé.
Espère que cela a aidé 🙂
Fonctions ne doivent pas nécessairement être déclarée d'abord comme un prototype. Une telle déclaration n'est nécessaire que si nous avons besoin d'utiliser une fonction avant qu'elle soit définie.
principal est de type int par définition.
Le sens de la valeur de retour de la principale est classique. La convention généralement acceptée est que 0 est considéré comme succès, et non pas 0 une sorte d'échec.
Lorsque nous lançons un programme C, les Ordinateurs de contrôle passe à l'programmes C main() fonction, à Partir de là lui-même le programme C commence à s'exécuter