Main function
Un programme doit contenir une fonction de l'espace de noms global nommée main , qui est le point de départ désigné du programme dans un environnement hébergé. Elle doit avoir l'une des formes suivantes :
int
main() {
corps
}
|
(1) | ||||||||
int
main(
int
argc
,
char
*
argv
[]
) {
corps
}
|
(2) | ||||||||
int
main(
/* implementation-defined */
) {
corps
}
|
(3) | ||||||||
main
s'exécutant indépendamment des arguments fournis par l'environnement.
main
acceptant les arguments fournis par l'environnement.
main
de type défini par l'implémentation, retournant
int
.
main
placent les paramètres supplémentaires (optionnels) après
argv
.
| argc | - | Valeur non négative représentant le nombre d'arguments passés au programme depuis l'environnement d'exécution. |
| argv | - | Pointeur vers le premier élément d'un tableau de argc + 1 pointeurs, dont le dernier est nul et les précédents, s'il y en a, pointent vers des chaînes multioctets terminées par un caractère nul qui représentent les arguments passés au programme depuis l'environnement d'exécution. Si argv [ 0 ] n'est pas un pointeur nul (ou, de manière équivalente, si argc > 0 ), il pointe vers une chaîne qui représente le nom utilisé pour invoquer le programme, ou vers une chaîne vide. |
| body | - |
Le corps de la fonction
main
.
|
Table des matières |
Explication
La fonction
main
est appelée au démarrage du programme après
l'initialisation
des objets non locaux ayant une
durée de stockage
statique. C'est le point d'entrée désigné d'un programme exécuté dans un environnement
hébergé
(c'est-à-dire avec un système d'exploitation). Les points d'entrée des programmes
autonomes
(chargeurs d'amorçage, noyaux de système d'exploitation, etc.) sont définis par l'implémentation.
Les paramètres de la forme à deux paramètres de la fonction
main
permettent de transmettre des chaînes de caractères multioctets arbitraires depuis l'environnement d'exécution (généralement appelées
arguments de ligne de commande
), les pointeurs
[
argv
[
1
]
,
argv
[
argc
-
1
]
]
pointent vers les premiers caractères de chacune de ces chaînes.
argv
[
0
]
(s'il n'est pas nul) est le pointeur vers le caractère initial d'une chaîne multioctets terminée par un caractère nul qui représente le nom utilisé pour invoquer le programme lui-même (ou une chaîne vide
""
si cela n'est pas pris en charge par l'environnement d'exécution). Les chaînes sont modifiables, bien que ces modifications ne se propagent pas en retour vers l'environnement d'exécution : elles peuvent être utilisées, par exemple, avec
std::strtok
. La taille du tableau pointé par
argv
est au moins
argc
+
1
, et le dernier élément,
argv
[
argc
]
, est garanti être un pointeur nul.
La fonction
main
possède les propriétés spéciales suivantes :
main
n'a pas besoin de contenir l'instruction
return
: si le contrôle atteint la fin de
main
sans rencontrer d'instruction return, l'effet est équivalent à l'exécution de
return
0
;
.
main
) est équivalente à quitter d'abord la fonction normalement (ce qui détruit les objets avec une durée de stockage automatique
et évalue toute
assertion de postcondition
de
main
(depuis C++26)
) puis à appeler
std::exit
avec le même argument que l'argument du
return
(
std::exit
détruit ensuite les objets statiques et termine le programme).
La fonction
main
possède plusieurs restrictions (dont la violation rend le programme mal formé) :
typeid
expression
ou un spécificateur
decltype
(depuis C++11)
main
dans l'espace de noms global est réservé aux fonctions (bien qu'il puisse être utilisé pour nommer des classes, des espaces de noms, des énumérations et toute entité dans un espace de noms non global, sauf qu'une entité nommée
main
ne peut pas être déclarée avec une
liaison de langage
C dans n'importe quel espace de noms).
constexpr
(depuis C++11)
,
consteval
(depuis C++20)
,
inline
, ou
static
.
|
4)
Le type de retour de la fonction
main
ne peut pas être déduit (
auto
main
(
)
{
...
}
n'est pas autorisé).
|
(depuis C++14) |
| (depuis C++20) |
Notes
Si la fonction
main
est définie avec un
bloc
try
de fonction
, les exceptions levées par les destructeurs des objets statiques (qui sont détruits par l'appel implicite à
std::exit
) ne sont pas
interceptées
par celui-ci.
La manière dont les arguments fournis sur la ligne de commande du système d'exploitation sont convertis en tableaux de caractères multioctets référencés par argv peut impliquer un traitement défini par l'implémentation :
Une implémentation très courante définie par l'implémentation de main ( ) possède un troisième argument (en plus de argc et argv ), de type char ** , pointant vers un tableau de pointeurs vers les variables d'environnement d'exécution .
Exemple
Montre comment indiquer à un programme où trouver ses entrées et où écrire ses résultats.
Une invocation possible :
.
/
convert table_in.
dat
table_out.
dat
#include <cstdlib> #include <iomanip> #include <iostream> int main(int argc, char *argv[]) { std::cout << "argc == " << argc << '\n'; for (int ndx{}; ndx != argc; ++ndx) std::cout << "argv[" << ndx << "] == " << std::quoted(argv[ndx]) << '\n'; std::cout << "argv[" << argc << "] == " << static_cast<void*>(argv[argc]) << '\n'; /* ... */ return argc == 3 ? EXIT_SUCCESS : EXIT_FAILURE; // optional return value }
Sortie possible :
argc == 3 argv[0] == "./convert" argv[1] == "table_in.dat" argv[2] == "table_out.dat" argv[3] == 0
Références
| Contenu étendu |
|---|
|
Rapports de défauts
Les rapports de défauts modifiant le comportement suivants ont été appliqués rétroactivement aux normes C++ précédemment publiées.
| DR | S'applique à | Comportement publié | Comportement corrigé |
|---|---|---|---|
| CWG 1003 | C++98 |
les noms de paramètres pris en charge pour
main
étaient excessivement restreints
|
tous les noms de paramètres valides
sont pris en charge |
| CWG 1886 | C++98 |
la fonction
main
pouvait être déclarée avec un lien de langage
|
interdit |
| CWG 2479 | C++20 |
la fonction
main
pouvait être déclarée
consteval
|
interdit |
| CWG 2811 | C++98 |
le statut d'utilisation de la fonction
main
après
N3214
n'était pas clair
|
elle est considérée comme utilisée lorsqu'elle est nommée |
Voir aussi
|
Documentation C
pour
main
function
|