Quelle est la manière correcte (la plus efficace) de définir la main()
fonction en C et C ++ - int main()
ou void main()
- et pourquoi? Si int main()
alors return 1
ou return 0
?
Il existe de nombreux doublons de cette question, notamment:
- Quelles sont les signatures valides pour la
main()
fonction de C ? - Le type de
main()
fonction de retour - Différence entre
void main()
etint main()
? main()
signature de C ++- Quelle est la bonne déclaration de
main()
? - Pour C ++, avec une très bonne réponse en effet. - Styles de
main()
fonctions en C - Retourne le type de
main()
méthode en C int main()
vsvoid main()
en C
En relation:
- C ++ -
int main(int argc, char **argv)
- C ++ -
int main(int argc, char *argv[])
- Est-
char *envp[]
ce un troisième argument pourmain()
portable? - La
int main()
fonction doit-elle renvoyer une valeur dans tous les compilateurs? - Pourquoi le type de la
main()
fonction en C et C ++ est-il laissé à l'utilisateur à définir? - Pourquoi
int main(){}
compile-t-on? - Définitions légales de
main()
C ++ 14?
c++
c
return-value
main
return-type
Joel
la source
la source
main
est appelé une fois (et en C ++ ne peut être appelé qu'une seule fois: pas de récursivité). Si vous ne voulez pas que l'exécution passe beaucoup de tempsmain
, n'invoquez pas le programme un grand nombre de fois: faites en sorte que le programme implémente la répétition.#include
déclarationsreturn
dansmain(...)
sur un appareil embarqué, votre système passe dans un état imprévisible et votre machine à laver deviendra conscient de soi et essayer de vous tuer. Donc, nous utilisonsvoid main()
dans ce cas. Il s'agit d'une pratique standard dans le secteur du métal nu embarqué.Réponses:
La valeur de retour pour
main
indique comment le programme s'est arrêté. La sortie normale est représentée par une valeur de retour 0 demain
. Une sortie anormale est signalée par un retour non nul, mais il n'y a pas de norme pour la façon dont les codes non nuls sont interprétés. Comme indiqué par d'autres,void main()
est interdit par la norme C ++ et ne doit pas être utilisé. Lesmain
signatures C ++ valides sont:et
ce qui équivaut à
Il convient également de noter qu'en C ++, il
int main()
peut être laissé sans instruction de retour, auquel cas il renvoie par défaut 0. Cela est également vrai avec un programme C99. Que cereturn 0;
soit omis ou non est sujet à débat. La plage de signatures principales valides du programme C est beaucoup plus grande.L'efficacité n'est pas un problème avec la
main
fonction. Il ne peut être entré et laissé qu'une seule fois (marquant le début et la fin du programme) selon la norme C ++. Pour C, la rentréemain()
est autorisée, mais doit être évitée.la source
La réponse acceptée semble être ciblée pour C ++, j'ai donc pensé ajouter une réponse qui concerne C, et cela diffère de plusieurs façons.
ISO / CEI 9899: 1989 (C90):
main()
doit être déclaré comme suit:Ou équivalent. Par exemple,
int main(int argc, char *argv[])
est équivalent au second. En outre, leint
type de retour peut être omis car il s'agit d'une valeur par défaut.Si une implémentation le permet, elle
main()
peut être déclarée par d'autres moyens, mais cela rend l'implémentation du programme définie et non plus strictement conforme.La norme définit 3 valeurs pour le retour qui sont strictement conformes (c'est-à-dire, ne reposent pas sur un comportement défini par l'implémentation):
0
etEXIT_SUCCESS
pour une terminaison réussie etEXIT_FAILURE
pour une terminaison infructueuse. Toutes les autres valeurs sont non standard et définies par l'implémentation.main()
doit avoir unereturn
déclaration explicite à la fin pour éviter un comportement indéfini.Enfin, il n'y a rien de mal du point de vue des normes à appeler à
main()
partir d'un programme.ISO / CEI 9899: 1999 (C99):
Pour C99, tout est le même que ci-dessus sauf:
int
type de retour ne doit pas être omis.main()
. Si vous le faites et que vous avezmain()
terminé, il y a un implicitereturn 0
.la source
Standard C - Environnement hébergé
Pour un environnement hébergé (c'est le normal), la norme C11 (ISO / IEC 9899: 2011) dit:
Fin du programme en C99 ou C11
La valeur renvoyée par
main()
est transmise à «l'environnement» d'une manière définie par l'implémentation.Notez que
0
c'est obligatoire comme «succès». Vous pouvez utiliserEXIT_FAILURE
et àEXIT_SUCCESS
partir de<stdlib.h>
si vous préférez, mais 0 est bien établi, ainsi que 1. Voir aussi Codes de sortie supérieurs à 255 - possible? .Dans C89 (et donc dans Microsoft C), il n'y a aucune déclaration sur ce qui se passe si la
main()
fonction retourne mais ne spécifie pas de valeur de retour; il conduit donc à un comportement indéfini.Standard C ++ - Environnement hébergé
La norme C ++ 11 (ISO / IEC 14882: 2011) dit:
Le standard C ++ dit explicitement "Il [la fonction principale] doit avoir un type de retour de type
int
, mais sinon son type est défini par l'implémentation", et requiert les deux mêmes signatures que le standard C pour être pris en charge en option. Ainsi, un 'void main ()' n'est directement pas autorisé par la norme C ++, bien qu'il ne puisse rien faire pour arrêter une implémentation non standard autorisant des alternatives. Notez que C ++ interdit à l'utilisateur d'appelermain
(mais pas la norme C).Il y a un paragraphe du §18.5 Début et fin dans la norme C ++ 11 qui est identique au paragraphe du §7.22.4.4 La
exit
fonction dans la norme C11 (citée ci-dessus), à l'exception d'une note de bas de page (qui documente simplement celaEXIT_SUCCESS
et quiEXIT_FAILURE
est définie dans<cstdlib>
).Norme C - Extension commune
Classiquement, les systèmes Unix prennent en charge une troisième variante:
Le troisième argument est une liste de pointeurs vers des chaînes terminée par un caractère nul, chacune étant une variable d'environnement qui a un nom, un signe égal et une valeur (éventuellement vide). Si vous ne l'utilisez pas, vous pouvez toujours accéder à l'environnement via '
extern char **environ;
'. Cette variable globale est unique parmi celles de POSIX en ce qu'elle n'a pas d'en-tête qui la déclare.Ceci est reconnu par la norme C comme une extension commune, documentée à l'annexe J:
Microsoft C
Le compilateur Microsoft VS 2010 est intéressant. Le site Web dit:
Il n'est pas clair pour moi ce qui se passe (quel code de sortie est retourné au parent ou au système d'exploitation) lorsqu'un programme se
void main()
ferme - et le site Web de MS est également silencieux.Fait intéressant, MS ne prescrit pas la version à deux arguments
main()
requise par les normes C et C ++. Il ne prescrit qu'une forme à trois arguments où se trouve le troisième argumentchar **envp
, un pointeur vers une liste de variables d'environnement.La page Microsoft répertorie également quelques autres alternatives -
wmain()
qui prennent des chaînes de caractères larges, et quelques autres.La version Microsoft Visual Studio 2005 de cette page ne figure pas
void main()
comme alternative. Les versions à partir de Microsoft Visual Studio 2008 le font.Norme C - Environnement autonome
Comme indiqué précédemment, les exigences ci-dessus s'appliquent aux environnements hébergés. Si vous travaillez avec un environnement autonome (qui est l'alternative à un environnement hébergé), la norme a beaucoup moins à dire. Pour un environnement autonome, la fonction appelée au démarrage du programme n'a pas besoin d'être appelée
main
et il n'y a aucune contrainte sur son type de retour. La norme dit:Le renvoi à l'article 4 Conformité se réfère à ceci:
Il est à noter que le seul en-tête requis d'un environnement autonome qui définit réellement toutes les fonctions est
<stdarg.h>
(et même celles-ci peuvent être - et sont souvent - simplement des macros).Standard C ++ - Environnement autonome
Tout comme la norme C reconnaît à la fois l'environnement hébergé et autonome, la norme C ++ aussi. (Citations de l'ISO / CEI 14882: 2011.)
Qu'en est-il de l'utilisation
int main()
en C?La norme §5.1.2.2.1 de la norme C11 montre la notation préférée -
int main(void)
- mais il y a aussi deux exemples dans la norme qui montrentint main()
: §6.5.3.4 ¶8 et §6.7.6.3 ¶20 . Maintenant, il est important de noter que les exemples ne sont pas «normatifs»; ils ne sont qu'illustratifs. S'il y a des bogues dans les exemples, ils n'affectent pas directement le texte principal de la norme. Cela dit, ils sont fortement indicatifs du comportement attendu, donc si la norme inclutint main()
dans un exemple, cela suggère que ceint main()
n'est pas interdit, même si ce n'est pas la notation préférée.la source
int main(){ … }
que spécifie que la fonction ne prend aucun argument, mais ne fournit pas de prototype de fonction, AFAICT. Carmain()
c'est rarement un problème; cela signifie que si vous avez des appels récursifs àmain()
, les arguments ne seront pas vérifiés. Pour les autres fonctions, c'est plus un problème - vous avez vraiment besoin d'un prototype dans la portée lorsque la fonction est appelée pour vous assurer que les arguments sont corrects.main()
récursivement, en dehors d'endroits comme IOCCC. J'ai un programme de test qui le fait - principalement pour la nouveauté. Si vous avezint i = 0; int main() { if (i++ < 10) main(i, i * i); return 0; }
et compilez avec GCC et n'incluez pas-Wstrict-prototypes
, il compile proprement sous des avertissements stricts. Si c'est le casmain(void)
, il ne parvient pas à compiler.Je crois que cela
main()
devrait revenir soitEXIT_SUCCESS
ouEXIT_FAILURE
. Ils sont définis dansstdlib.h
la source
EXIT_SUCCESS
etEXIT_FAILURE
parce que certains systèmes d'exploitation historiques (VMS?) Ont utilisé un nombre différent de 0 pour indiquer le succès. C'est 0 partout de nos jours.exit(EXIT_SUCCESS)
, ce qui faisait toujours la bonne chose.Notez que les normes C et C ++ définissent deux types d'implémentations: autonomes et hébergées.
Environnement hébergé C90
Formulaires autorisés 1 :
Commentaires:
Les deux premiers sont explicitement indiqués comme les formes autorisées, les autres sont implicitement autorisés car C90 a autorisé "implicit int" pour le type de retour et les paramètres de fonction. Aucun autre formulaire n'est autorisé.
Environnement autoportant C90
Toute forme ou nom de principal est autorisé 2 .
Environnement hébergé C99
Formulaires autorisés 3 :
Commentaires:
C99 a supprimé "implicit int" et
main()
n'est donc plus valide.Une phrase étrange et ambiguë "ou d'une autre manière définie par la mise en œuvre" a été introduite. Cela peut être interprété comme «les paramètres
int main()
peuvent varier» ou comme «principal peut avoir n'importe quelle forme définie par l'implémentation».Certains compilateurs ont choisi d'interpréter la norme de cette dernière manière. On peut sans doute affirmer qu'ils ne sont pas strictement conformes en citant la norme en elle-même, car elle est ambiguë.
Cependant, autoriser des formes complètement sauvages
main()
n'était probablement pas (?) L'intention de cette nouvelle phrase. La justification C99 (non normative) implique que la phrase se réfère à des paramètres supplémentaires àint main
4 .Pourtant, la section relative à l'arrêt du programme d'environnement hébergé continue de discuter du cas où main ne retourne pas int 5 . Bien que cette section ne soit pas normative sur la façon dont main doit être déclarée, elle implique certainement que main pourrait être déclarée de manière complètement définie par l'implémentation, même sur les systèmes hébergés.
Environnement autonome C99
Toute forme ou nom de principal est autorisé 6 .
Environnement hébergé C11
Formulaires autorisés 7 :
Environnement autonome C11
Toute forme ou nom de principal est autorisé 8 .
Notez que
int main()
n'a jamais été répertorié comme un formulaire valide pour toute implémentation hébergée de C dans l'une des versions ci-dessus. En C, contrairement à C ++,()
et(void)
ont des significations différentes. Le premier est une fonction obsolète qui peut être supprimée de la langue. Voir les futures orientations linguistiques du C11:Environnement hébergé C ++ 03
Formulaires autorisés 9 :
Commentaires:
Notez la parenthèse vide dans le premier formulaire. C ++ et C sont différents dans ce cas, car en C ++, cela signifie que la fonction ne prend aucun paramètre. Mais en C, cela signifie qu'il peut prendre n'importe quel paramètre.
Environnement autonome C ++ 03
Le nom de la fonction appelée au démarrage est défini par l'implémentation. S'il est nommé,
main()
il doit suivre les formulaires indiqués 10 :Environnement hébergé C ++ 11
Formulaires autorisés 11 :
Commentaires:
Le texte de la norme a été modifié, mais il a la même signification.
Environnement autonome C ++ 11
Le nom de la fonction appelée au démarrage est défini par l'implémentation. S'il est nommé,
main()
il doit suivre les formulaires indiqués 12 :Références
ANSI X3.159-1989 2.1.2.2 Environnement hébergé. "Démarrage du programme"
ANSI X3.159-1989 2.1.2.1 Environnement autonome:
ISO 9899: 1999 5.1.2.2 Environnement hébergé -> 5.1.2.2.1 Démarrage du programme
Justification de la Norme internationale - Langages de programmation - C, révision 5.10. 5.1.2.2 Environnement hébergé -> 5.1.2.2.1 Démarrage du programme
ISO 9899: 1999 5.1.2.2 Environnement hébergé -> 5.1.2.2.3 Arrêt du programme
ISO 9899: 1999 5.1.2.1 Environnement autonome
ISO 9899: 2011 5.1.2.2 Environnement hébergé -> 5.1.2.2.1 Démarrage du programme
Cette section est identique à la C99 citée ci-dessus.
ISO 9899: 1999 5.1.2.1 Environnement autonome
Cette section est identique à la C99 citée ci-dessus.
ISO 14882: 2003 3.6.1 Fonction principale
ISO 14882: 2003 3.6.1 Fonction principale
ISO 14882: 2011 3.6.1 Fonction principale
ISO 14882: 2011 3.6.1 Fonction principale
Cette section est identique à celle de C ++ 03 citée ci-dessus.
la source
int my_startup_function ()
ouint my_startup_function (int argc, char *argv[])
mais peut-elle avoir, par exemple:char my_startup_function (long argc, int *argv[])
comme fonction de démarrage également? Je suppose que non, non? De plus, n'est-ce pas aussi ambigu?main()
car il doit alors utiliser l'une des signatures répertoriées. J'imagine que la plus écrasante serait la plus courantevoid my_startup_function ()
, car cela n'a pas de sens de revenir du programme sur les systèmes autonomes.main
? Désolé si ce n'est pas une question intelligente, mais je ne pouvais pas comprendre le raisonnement derrière.func()
est considéré comme obsolète, le projet lui-même utiliseint main()
dans ses propres exemples.Retourne 0 en cas de succès et non nul pour l'erreur. Il s'agit de la norme utilisée par les scripts UNIX et DOS pour savoir ce qui s'est passé avec votre programme.
la source
main()
dans C89 et K&R C, les types de retour non spécifiés sont définis par défaut sur «int».Si vous n'écrivez pas de déclaration de retour dans
int main()
, la fermeture{
renverra 0 par défaut.return 0
oureturn 1
sera reçu par le processus parent. Dans un shell, il va dans une variable shell, et si vous exécutez votre programme sous forme de shell et n'utilisez pas cette variable, vous n'avez pas à vous soucier de la valeur de retour demain()
.Voir Comment puis-je obtenir ce que ma fonction principale a renvoyé? .
De cette façon, vous pouvez voir que c'est la variable
$?
qui reçoit l'octet le moins significatif de la valeur de retour demain()
.Dans les scripts Unix et DOS,
return 0
en cas de succès et non nul pour l'erreur sont généralement retournés. Il s'agit de la norme utilisée par les scripts Unix et DOS pour découvrir ce qui s'est passé avec votre programme et contrôler l'ensemble du flux.la source
$?
n'est pas une variable d'environnement; il s'agit d'une variable prédéfinie (ou intégrée) du shell. La différence est difficile à repérer, mais si vous exécutezenv
(sans aucun argument), elle imprime l'environnement et$?
ne sera pas affichée dans l'environnement.{
" devrait être}
. SO ne me permettra pas de faire un montage aussi petit.Gardez à l'esprit que, même si vous retournez un entier, certains systèmes d'exploitation (Windows) tronquent la valeur renvoyée en un seul octet (0-255).
la source
unsigned
). C'est la même chose sur les systèmes UNIX avec des entiers 32 bits. Mais les shells de style UNIX sur l'un ou l'autre système ne conservent généralement qu'un entier 8 bits non signé.La valeur de retour peut être utilisée par le système d'exploitation pour vérifier la fermeture du programme.
La valeur de retour 0 signifie généralement OK dans la plupart des systèmes d'exploitation (ceux auxquels je pense de toute façon).
Il peut également être vérifié lorsque vous appelez un processus vous-même et voyez si le programme s'est terminé et s'est terminé correctement.
Ce n'est PAS seulement une convention de programmation.
la source
La valeur de retour de
main()
montre comment le programme s'est arrêté. Si la valeur de retour est,zero
cela signifie que l'exécution a réussi, tandis que toute valeur non nulle représentera que quelque chose s'est mal passé dans l'exécution.la source
J'avais l'impression que la norme spécifie que le principal n'a pas besoin d'une valeur de retour car un retour réussi était basé sur le système d'exploitation (zéro dans l'un pourrait être un succès ou un échec dans un autre), donc l'absence de retour était un signal pour le compilateur pour insérer le retour réussi lui-même.
Cependant, je retourne généralement 0.
la source
Renvoyer 0 devrait indiquer au programmeur que le programme a correctement terminé le travail.
la source
main()
signale normalement qu'une erreur s'est produite; renvoyer 0 signale le succès. Si vos programmes échouent toujours, alors 1 est OK, mais ce n'est pas la meilleure idée.1
demain
est défini par l' implémentation. Les seules valeurs définies par le langage sont0
,EXIT_SUCCESS
(souvent définies comme0
), etEXIT_FAILURE
. Dans OpenVMS,return 1;
indique une terminaison réussie .Omettre
return 0
Lorsqu'un programme C ou C ++ atteint la fin du
main
compilateur génère automatiquement du code pour retourner 0, il n'est donc pas nécessaire de mettrereturn 0;
explicitement à la fin demain
.Remarque: lorsque je fais cette suggestion, elle est presque invariablement suivie d'un des deux types de commentaires: "Je ne le savais pas." ou "C'est un mauvais conseil!" Ma justification est qu'il est sûr et utile de s'appuyer sur le comportement du compilateur explicitement pris en charge par la norme. Pour C, depuis C99; voir ISO / IEC 9899: 1999 section 5.1.2.2.3:
Pour C ++, depuis la première norme en 1998; voir ISO / IEC 14882: 1998 section 3.6.1:
Depuis lors, toutes les versions des deux normes (C99 et C ++ 98) ont conservé la même idée. Nous nous appuyons sur les fonctions membres générées automatiquement en C ++, et peu de gens écrivent des
return;
instructions explicites à la fin d'unevoid
fonction. Les raisons de ne pas le faire semblent se résumer à "ça a l'air bizarre" . Si, comme moi, vous êtes curieux de connaître la justification du changement de la norme C, lisez cette question . Notez également qu'au début des années 90, cela était considéré comme une "pratique bâclée" car il s'agissait à l'époque d'un comportement indéfini (bien que largement soutenu).En outre, les directives de base C ++ contiennent plusieurs instances d'omission
return 0;
à la finmain
et aucune instance dans laquelle un retour explicite est écrit. Bien qu'il n'y ait pas encore de directive spécifique sur ce sujet particulier dans ce document, cela semble au moins une approbation tacite de la pratique.Je préconise donc de l'omettre; d'autres ne sont pas d'accord (souvent avec véhémence!) Dans tous les cas, si vous rencontrez du code qui l'omet, vous saurez qu'il est explicitement pris en charge par la norme et vous saurez ce que cela signifie.
la source
return 0;
, mais je noterais que de nombreux compilateurs de cette époque ont également implémenté un implicitereturn 0;
avant même qu'il ne soit normalisé.return 0
depuis plus d'une décennie. Les versions actuelles de Microsoft C le prennent également en charge . Peut-être que vos informations sont obsolètes?Que retourner dépend de ce que vous voulez faire avec l'exécutable. Par exemple, si vous utilisez votre programme avec un shell de ligne de commande, vous devez retourner 0 pour un succès et un non nul pour un échec. Ensuite, vous pourrez utiliser le programme dans des shells avec un traitement conditionnel en fonction du résultat de votre code. Vous pouvez également attribuer une valeur différente de zéro selon votre interprétation, par exemple pour les erreurs critiques, différents points de sortie de programme pourraient terminer un programme avec différentes valeurs de sortie, et qui est disponible pour le shell appelant qui peut décider quoi faire en inspectant la valeur retournée. Si le code n'est pas destiné à être utilisé avec des shells et que la valeur renvoyée ne dérange personne, il peut être omis. J'utilise personnellement la signature
int main (void) { .. return 0; .. }
la source
main
est compatible avecint
. Le retourint
ne sera donc pas un problème. Bien que d'autres types de retour soient autorisés, mais dans ce cas, la variable d'environnement ayant la valeur de retour ne sera pas spécifiée. Mais si un programmeur le faitreturn 0;
dans bash, il peut être utilisé pour créer des branches.Si vous avez vraiment des problèmes liés à l'efficacité du retour d'un entier à partir d'un processus, vous devriez probablement éviter d'appeler ce processus tant de fois que cette valeur de retour devient un problème.
Si vous faites cela (appelez un processus tant de fois), vous devriez trouver un moyen de mettre votre logique directement dans l'appelant, ou dans un fichier DLL, sans allouer un processus spécifique pour chaque appel; les allocations de processus multiples vous posent le problème d'efficacité pertinent dans ce cas.
En détail, si vous voulez seulement savoir si le retour de 0 est plus ou moins efficace que le retour de 1, cela peut dépendre du compilateur dans certains cas, mais de manière générique, en supposant qu'ils sont lus à partir de la même source (local, champ, constant, intégré dans le code, le résultat de la fonction, etc.), il nécessite exactement le même nombre de cycles d'horloge.
la source
Voici une petite démonstration de l'utilisation des codes retour ...
Lorsque vous utilisez les divers outils fournis par le terminal Linux, vous pouvez utiliser le code retour, par exemple pour la gestion des erreurs une fois le processus terminé. Imaginez que le fichier texte suivant myfile soit présent:
Lorsque vous exécutez la commande grep, un processus est créé. Une fois qu'il a traversé (et n'a pas cassé), il retourne du code entre 0 et 255. Par exemple:
Si tu fais
vous obtiendrez un 0. Pourquoi? Parce que grep a trouvé une correspondance et a renvoyé un code de sortie 0, qui est la valeur habituelle pour quitter avec succès. Vérifions-le à nouveau mais avec quelque chose qui n'est pas dans notre fichier texte et donc aucune correspondance ne sera trouvée:
Étant donné que grep n'a pas réussi à faire correspondre le jeton "foo" avec le contenu de notre fichier, le code de retour est 1 (c'est le cas habituel en cas d'échec, mais comme indiqué ci-dessus, vous avez le choix entre de nombreuses valeurs).
Maintenant, le script bash suivant (tapez-le simplement dans un terminal Linux) bien que très basique devrait donner une idée de la gestion des erreurs:
Après la deuxième ligne, rien n'est imprimé sur le terminal car "foo" a fait grep retourner 1 et nous vérifions si le code de retour de grep était égal à 0. La deuxième instruction conditionnelle fait écho à son message dans la dernière ligne car elle est vraie en raison de CHECK == 1.
Comme vous pouvez voir si vous appelez ceci et ce processus, il est parfois essentiel de voir ce qu'il a retourné (par la valeur de retour de main ()).
la source
if grep foo myfile; then echo 'Match found'; else echo 'No match was found'; fi
- tester directement le statut de retour. Si vous souhaitez capturer l'état (pour les rapports, etc.), vous utilisez une affectation. Vous pouvez utiliserif grep foo myfile; CHECK=$?; [ "$CHECK" = 0 ]; then echo 'Match found'; else echo 'No match was found'; fi
ou utiliser trois lignes. Vous pouvez également utiliser les options-s
et-q
pourgrep
empêcher les correspondances ou les messages d'erreur de routine d'apparaître. Cependant, ce sont les minuties du shell - le point clé, que l'état de sortie peut être utile - est OK.Ces mots «(le plus efficace)» ne changent pas la question. À moins que vous ne soyez dans un environnement autonome, il existe une façon universellement correcte de déclarer
main()
, et c'est comme retourner int.Ce n'est pas ce qui devrait
main()
revenir, c'est ce quimain()
revient.main()
est, bien sûr, une fonction que quelqu'un d'autre appelle. Vous n'avez aucun contrôle sur le code qui appellemain()
. Par conséquent, vous devez déclarermain()
avec une signature de type correct pour correspondre à son appelant. Vous n'avez tout simplement pas le choix en la matière. Vous n'avez pas à vous demander ce qui est plus ou moins efficace, ou ce qui est meilleur ou pire style, ou quelque chose comme ça, car la réponse est déjà parfaitement bien définie, pour vous, par les normes C et C +. Suivez-les.0 pour le succès, différent de zéro pour l'échec. Encore une fois, ce n'est pas quelque chose que vous devez (ou obtenir) choisir: il est défini par l'interface à laquelle vous êtes censé vous conformer.
la source