Namespaces
Variants

Main function

From cppreference.net
C++ language
General topics
Flow control
Conditional execution statements
Iteration statements (loops)
Jump statements
Functions
Function declaration
Lambda function expression
inline specifier
Dynamic exception specifications ( until C++17* )
noexcept specifier (C++11)
Exceptions
Namespaces
Types
Specifiers
constexpr (C++11)
consteval (C++20)
constinit (C++20)
Storage duration specifiers
Initialization
Expressions
Alternative representations
Literals
Boolean - Integer - Floating-point
Character - String - nullptr (C++11)
User-defined (C++11)
Utilities
Attributes (C++11)
Types
typedef declaration
Type alias declaration (C++11)
Casts
Memory allocation
Classes
Class-specific function properties
Special member functions
Templates
Miscellaneous

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)
1) Une fonction main s'exécutant indépendamment des arguments fournis par l'environnement.
2) Une fonction main acceptant les arguments fournis par l'environnement.
Les noms de argc et argv sont arbitraires, tout comme la représentation des types des paramètres : int main ( int ac, char ** av ) est également valide.
3) Une fonction main de type défini par l'implémentation, retournant int .
La norme C++ recommande que les fonctions d'implémentation-définie 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 :

1) Le corps de la fonction 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 ; .
2) L'exécution du return (ou du return implicite lors de l'atteinte de la fin de 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é) :

1) Il ne peut pas être nommé n'importe où dans le programme
a) en particulier, il ne peut pas être appelé récursivement
b) son adresse ne peut pas être prise
c) il ne peut pas être utilisé dans une typeid expression ou un spécificateur decltype (depuis C++11)
2) Il ne peut pas être prédéfini et ne peut pas être surchargé : effectivement, le nom 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).
3) Il ne peut pas être défini comme supprimé ou (depuis C++11) déclaré avec quelque linkage de langage que ce soit , 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)
5) La fonction main ne peut pas être une coroutine .
6) La fonction main ne peut pas être attachée à un module nommé.
(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
  • Norme C++23 (ISO/IEC 14882:2024) :
  • 6.9.3.1 Fonction main [basic.start.main]

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