[J'ai copié une version étendue de mes réponses à la copie de questions ici, car il couvre (et les citations) Standard C, C++ Standard de Microsoft et de variations, dont aucune des autres réponses ici semble faire. Depuis ce qui semble être la première question sur un Débordement de Pile couvrant le sujet, il devrait être celui qui a été choisi comme la question définitive, et il devrait avoir la meilleure (la plus près de définitif) réponse(s).]
C Standard
Pour un environnement hébergé (c'est normal), le C11 norme (ISO/IEC 9899:2011) dit:
5.1.2.2.1 démarrage du Programme
La fonction appelée au démarrage du programme est nommé main
. La mise en œuvre déclare aucun
prototype de cette fonction. Il doit être défini avec un type de retour d' int
et sans
paramètres:
int main(void) { /* ... */ }
ou avec deux paramètres (dénommée ci - argc
et argv
, bien que les noms peuvent être
utilisées car elles sont locales à la fonction dans laquelle elles sont déclarées):
int main(int argc, char *argv[]) { /* ... */ }
ou l'équivalent;10) ou dans certains autres définis par l'implémentation.
S'ils sont déclarés, les paramètres de la fonction main doit obéir à la suivante
contraintes:
- La valeur de
argc
doit être positif ou nul.
-
argv[argc]
doit être un pointeur null.
- Si la valeur de
argc
, est supérieure à zéro, les membres du groupe argv[0]
par
argv[argc-1]
inclusive doit contenir des pointeurs vers des chaînes, qui sont donnés
mise en œuvre-les valeurs définies par l'hôte de l'environnement avant le démarrage du programme. L'
l'intention est de fournir de l'information sur le programme les a préalablement déterminés avant le démarrage du programme
d'ailleurs dans l'environnement hébergé. Si l'hôte de l'environnement n'est pas capable de
la fourniture de chaînes de caractères avec des lettres à la fois des majuscules et des minuscules, la mise en œuvre
veillent à ce que les chaînes sont reçues en minuscules.
- Si la valeur de
argc
, est supérieure à zéro, la chaîne pointée par argv[0]
représente le nom du programme; argv[0][0]
doit être le caractère null si l'
nom du programme n'est pas disponible à partir de l'hôte de l'environnement. Si la valeur de argc
est
supérieur à un, les chaînes de caractères pointée par argv[1]
par argv[argc-1]
représentent les paramètres du programme.
- Les paramètres
argc
et argv
et les chaînes pointées par l' argv
tableau est
être modifiable par le programme, et de conserver leur dernier-valeurs stockées entre programme
de démarrage et de fin de programme.
10) Ainsi, int
peut être remplacé par un typedef nom défini comme int
, ou le type d' argv
peut être écrite comme
char **argv
, et ainsi de suite.
De fin de programme en C99 ou C11
La valeur renvoyée par main()
est transmis à l '"environnement" dans une mise en œuvre défini.
5.1.2.2.3 de fin de Programme
1 Si le type de retour de la main
fonction est un type compatible avec int
, un retour de l'
appel initial à l' main
fonction est équivalent à l'appel de l' exit
de la fonction avec la valeur
retourné par l' main
fonction comme argument;11) d'atteindre l' }
qui met fin à la
main
de la fonction renvoie une valeur de 0. Si le type de retour n'est pas compatible avec int
, le
la résiliation état renvoyé à l'environnement d'accueil est quelconque.
11) conformément À l'6.2.4, la durée de vie des objets avec stockage automatique de la durée déclarée en main
terminée dans le premier cas, même là où ils n'auraient pas dans le second.
Notez que 0
est mandaté comme "succès". Vous pouvez utiliser EXIT_FAILURE
et EXIT_SUCCESS
de <stdlib.h>
si vous préférez, mais 0 est bien établi, et est donc 1. Voir aussi les codes de Sortie supérieure à 255 - ce possible?.
En C89 (et donc dans Microsoft C), il n'existe aucune déclaration au sujet de ce qui se passe si l' main()
fonction retourne mais ne spécifie pas de valeur de retour; il a donc conduit à un comportement indéterminé.
Standard C++
Le C++11 norme (ISO/IEC 14882:2011) dit:
3.6.1 fonction Principale [de base.commencer.principal]
¶1 Un programme doit contenir une fonction globale appelée principal, qui est le départ du programme. [...]
¶2 Une mise en œuvre ne doit pas prédéfinir la fonction principale. Cette fonction ne doit pas être surchargé. Il est
avoir un type de retour de type int, mais sinon, son type est définie par l'implémentation.
Toutes les implémentations
doit permettre à la fois de la définition suivante de la page principale:
int main() { /* ... */ }
et
int main(int argc, char* argv[]) { /* ... */ }
Dans cette dernière forme argc
est le nombre d'arguments passés au programme à partir de l'environnement
dans lequel le programme est exécuté. Si argc
est différente de zéro, ces arguments doivent être fournies en argv[0]
par le biais argv[argc-1]
que des pointeurs vers les caractères initiaux de null chaînes de caractères multi-octets (NTMBSs) (17.5.2.1.4.2) et argv[0]
est le pointeur vers le premier caractère d'un NTMBS qui représente le
nom utilisé pour appeler le programme ou ""
. La valeur de argc
sont non-négatives. La valeur de argv[argc]
sera de 0. [ Note: Il est recommandé que tous les autres paramètres (facultatif) être ajoutés après l' argv
. la fin de l'
note ]
¶3 La fonction main
ne doit pas être utilisé à l'intérieur d'un programme. [...]
¶5 de l'instruction return dans le main a l'effet de quitter la fonction principale (en détruisant tous les objets avec automatique
durée de stockage) et de l'appel de std::sortie avec la valeur de retour comme argument. Si le contrôle atteint la fin
de la main sans la rencontre d'une instruction de retour, l'effet est celui de l'exécution de
return 0;
La norme C++ explicitement dit: "Elle [la fonction principale] a un type de retour de type int, mais sinon, son type est définie par l'implémentation", et exige la même chose de deux signatures que le C standard. Donc un " void main()' n'est pas directement admis par la norme C++, mais il n'y a rien qu'elle peut faire pour arrêter un non-standard permettant la mise en œuvre des solutions de rechange. A noter que C++ interdit à l'utilisateur d'appeler l' main
(mais la C standard ne fonctionne pas).
Extension Commun
Classiquement, les systèmes Unix appuyer une troisième variante:
int main(int argc, char **argv, char **envp) { ... }
Le troisième argument est null liste de pointeurs sur des chaînes de caractères, dont chacun est une variable d'environnement qui a un nom, un signe égal, et une valeur (éventuellement vide). Si vous n'utilisez pas, vous pouvez toujours obtenir à l'environnement en passant par 'extern char **environ;
'. Depuis longtemps, qui n'ont pas d'en-tête qui l'a déclaré, mais la POSIX 2008 norme exige qu'il soit déclaré en <unistd.h>
.
Ce fait est reconnu par la norme comme une extension commune, documenté dans l'Annexe J:
J. 5.1 Environnement arguments
¶1 Dans un environnement hébergé, la fonction principale reçoit un troisième argument, char *envp[]
,
que de points pour un nul tableau de pointeurs char
, dont chacun des points d'une chaîne de caractères
qui fournit des informations sur l'environnement d'exécution du programme (5.1.2.2.1).
Microsoft C
Le Microsoft VS 2010 compilateur est intéressant. Le site web dit:
La syntaxe de déclaration des principaux est
int main();
ou, éventuellement,des
int main(int argc, char *argv[], char *envp[]);
Sinon, l' main
et wmain
fonctions peuvent être déclarés comme retournant void
(pas de valeur de retour). Si vous déclarez main
ou wmain
retournant void, vous ne pouvez pas retourner un code de sortie du processus parent ou du système d'exploitation à l'aide de l'instruction return. Pour retourner un code de sortie lors de l' main
ou wmain
est déclaré en tant que void
, vous devez utiliser l' exit
fonction.
Il n'est pas clair pour moi ce qui se passe (ce code de sortie est remise à la société mère ou de l'o/s) lorsqu'un programme avec void main()
t sortie - et le MME site web est trop silencieux.
Il est intéressant de noter, MS ne prescrit pas la version à deux arguments de main()
que le C et le C++ normes exigent. Il ne prescrit trois argument forme où le troisième argument est - char **envp
, un pointeur vers une liste de variables d'environnement.
Microsoft page répertorie également des alternatives - wmain()
qui prend l'échelle des chaînes de caractères, et un peu plus.
Microsoft VS 2005 version de cette page ne liste pas l' void main()
comme une alternative. Les versions de Microsoft VS à partir de 2008 ne.