main
arguments de fonction et de ligne de commande
Tous les programmes C++ doivent avoir une main
fonction. Si vous essayez de compiler un programme C++ sans main
fonction, le compilateur génère une erreur. (Les bibliothèques et static bibliothèques de liaison dynamique n’ont pas de main
fonction.) La main
fonction est l’endroit où votre code source commence l’exécution, mais avant qu’un programme entre dans la main
fonction, tous les static membres de classe sans initialiseurs explicites sont définis sur zéro. Dans Microsoft C++, les objets globaux static sont également initialisés avant l’entrée .main
Plusieurs restrictions s’appliquent à la main
fonction qui ne s’applique pas à d’autres fonctions C++. La fonction main
:
- Impossible de surcharger (voir Surcharge de fonction).
- Ne peut pas être déclaré en tant que
inline
. - Ne peut pas être déclaré en tant que
static
. - Son adresse ne peut pas être prise.
- Ne peut pas être appelée à partir de votre programme.
Signature de la fonction main
La fonction main
n’a pas de déclaration, car elle est intégrée au langage. Si elle en avait, la syntaxe de déclaration pour main
ressemblerait à ceci :
int main();
int main(int argc, char *argv[]);
Si aucune valeur de retour n’est spécifiée, main
le compilateur fournit une valeur de retour de zéro.
Arguments de ligne de commande standard
Arguments pour main
autoriser l’analyse de ligne de commande pratique des arguments. Les types pour argc
et argv
sont définis par le langage. Les noms argc
et argv
sont traditionnels, mais vous pouvez les nommer comme vous le souhaitez.
Les définitions d’argument sont les suivantes :
argc
Entier qui contient le nombre d’arguments qui suivent .argv Le paramètre argc est toujours supérieur ou égal à 1.
argv
Tableau de chaînes terminées par le caractère NULL qui représentent les arguments de ligne de commande entrés par l’utilisateur du programme. Par convention, argv[0]
est la commande avec laquelle le programme est appelé. argv[1]
est le premier argument de ligne de commande. Le dernier argument de la ligne de commande est argv[argc - 1]
, et argv[argc]
est toujours NULL.
Pour plus d’informations sur la suppression du traitement en ligne de commande, consultez Personnaliser le traitement en ligne de commande C++.
Remarque
Par convention, argv[0]
est le nom du fichier du programme. Toutefois, sur Windows, il est possible de générer un processus à l’aide CreateProcess
de . Si vous utilisez à la fois les premiers et les deuxième arguments (et lpCommandLine
),lpApplicationName
argv[0]
il se peut que le nom exécutable ne soit pas le nom exécutable. Vous pouvez utiliser GetModuleFileName
pour récupérer le nom exécutable et son chemin d’accès complet.
Extensions spécifiques à Microsoft
Les sections suivantes décrivent le comportement spécifique à Microsoft.
Fonction wmain
et _tmain
macro
Si vous concevez votre code source pour utiliser des acteurs à l’échelle charUnicode, vous pouvez utiliser le point d’entrée spécifique à wmain
Microsoft, qui est la version de l’acteur largechar de main
. Voici la syntaxe de déclaration effective pour wmain
:
int wmain();
int wmain(int argc, wchar_t *argv[]);
Vous pouvez également utiliser la macro spécifique à _tmain
Microsoft, qui est une macro de préprocesseur définie dans tchar.h
. _tmain
se résout à main
moins d’être _UNICODE
défini. Dans ce cas, _tmain
est résolu à wmain
. La _tmain
macro et d’autres macros qui commencent _t
par sont utiles pour le code qui doit générer des versions distinctes pour les ensembles d’acteurs étroits et larges char. Pour plus d’informations, consultez Utilisation de mappages de texte générique.
Retour void
de main
En tant qu’extension Microsoft, les main
fonctions peuvent wmain
être déclarées comme retournant void
(aucune valeur de retour). Cette extension est également disponible dans d’autres compilateurs, mais son utilisation n’est pas recommandée. Elle est disponible pour la symétrie quand main
elle ne retourne pas de valeur.
Si vous déclarez ou retournezmain
, vous ne pouvez pas retourner void
de exit code au processus parent ou au système d’exploitation à l’aide d’une return
instruction.wmain
Pour retourner un exit code quand main
ou wmain
est déclaré en tant que void
, vous devez utiliser la exit
fonction.
Argument de ligne de commande envp
wmain
Les main
signatures autorisent une extension facultative spécifique à Microsoft pour l’accès aux variables d’environnement. Cette extension est également courante dans d’autres compilateurs pour les systèmes Windows et UNIX. Le nom envp
est traditionnel, mais vous pouvez nommer le paramètre d’environnement comme vous le souhaitez. Voici les déclarations effectives des listes d’arguments qui incluent le paramètre d’environnement :
int main(int argc, char* argv[], char* envp[]);
int wmain(int argc, wchar_t* argv[], wchar_t* envp[]);
envp
Le paramètre facultatif envp
est un tableau de chaînes représentant les variables définies dans l’environnement de l’utilisateur. Ce tableau se termine par une entrée NULL. Il peut être déclaré en tant que tableau de pointeurs vers char
(char *envp[]
) ou en tant que pointeur char
vers (char **envp
). Si votre programme utilise wmain
au lieu de , utilisez le wchar_t
type de main
données au lieu de char
.
Le bloc d’environnement passé et main
wmain
est une copie « figée » de l’environnement actuel. Si vous modifiez ultérieurement l’environnement en effectuant un appel vers putenv
ou _wputenv
, l’environnement actuel (tel que retourné par getenv
ou _wgetenv
et par la _environ
_wenviron
variable) change, mais le bloc pointé par envp
ne changera pas. Pour plus d’informations sur la suppression du traitement de l’environnement, consultez Personnaliser le traitement en ligne de commande C++. L’argument envp
est compatible avec la norme C89, mais pas avec les normes C++.
Exemples d’arguments à main
L’exemple suivant montre comment utiliser les arguments et envp
les argc
argv
arguments pour main
:
// argument_definitions.cpp
// compile with: /EHsc
#include <iostream>
#include <string.h>
using namespace std;
int main( int argc, char *argv[], char *envp[] )
{
bool numberLines = false; // Default is no line numbers.
// If /n is passed to the .exe, display numbered listing
// of environment variables.
if ( (argc == 2) && _stricmp( argv[1], "/n" ) == 0 )
numberLines = true;
// Walk through list of strings until a NULL is encountered.
for ( int i = 0; envp[i] != NULL; ++i )
{
if ( numberLines )
cout << i << ": "; // Prefix with numbers if /n specified
cout << envp[i] << "\n";
}
}
Analyse des arguments de ligne de commande C++
Les règles d’analyse de ligne de commande utilisées par le code Microsoft C/C++ sont spécifiques à Microsoft. Le code de démarrage du runtime utilise ces règles lors de l’interprétation des arguments donnés sur la ligne de commande du système d’exploitation :
Les arguments sont délimités par un espace blanc, qui peut être un espace ou une tabulation.
Le premier argument (
argv[0]
) est traité de manière spéciale. Il représente le nom du programme. Comme il doit s’agir d’un nom de chemin d’accès valide, les parties entourées de guillemets doubles ("
) sont autorisées. Les guillemets doubles ne sont pas inclus dans la sortieargv[0]
. Les parties entourées de guillemets doubles empêchent l’interprétation d’un espace ou d’un acteur de tabulation charcomme fin de l’argument. Les règles suivantes répertoriées dans cette liste ne s’appliquent pas.Une chaîne entourée de guillemets doubles est interprétée comme un argument unique, qui peut contenir des acteurs d’espace charblanc. Une chaîne entre guillemets peut être incorporée dans un argument. Le pointeur (
^
) n’est pas reconnu comme un acteur d’échappement charou un délimiteur. Dans une chaîne entre guillemets, une paire de guillemets doubles est interprétée comme un seul guillemet double échappé. Si la ligne de commande se termine avant qu’une guillemet double fermante soit trouvée, tous les characteurs lus jusqu’à présent sont de sortie comme dernier argument.Un guillemet double précédé d’une barre oblique inverse (
\"
) est interprété comme un guillemet double littéral ("
).Les barres obliques inverses sont interprétées littéralement, sauf si elles précèdent immédiatement un guillemet double.
Si un nombre pair de barres obliques inverses est suivi d’un guillemet double, une barre oblique inverse (
\
) est placée dans le tableauargv
pour chaque paire de barres obliques inverses (\\
) et le guillemet double ("
) est interprété comme un délimiteur de chaîne.Si un nombre impair de barres obliques inverses est suivi d’un guillemet double, une barre oblique inverse (
\
) est placée dans le tableauargv
pour chaque paire de barres obliques inverses (\\
). La marque de guillemets doubles est interprétée comme une séquence d’échappement par lamainbarre oblique inverse reing, ce qui entraîne la mise enargv
place d’un guillemet double littéral ("
) .
Exemple d’analyse d’argument de ligne de commande
Le programme suivant montre comment les arguments de ligne de commande sont passés :
// command_line_arguments.cpp
// compile with: /EHsc
#include <iostream>
using namespace std;
int main( int argc, // Number of strings in array argv
char *argv[], // Array of command-line argument strings
char *envp[] ) // Array of environment variable strings
{
int count;
// Display each command-line argument.
cout << "\nCommand-line arguments:\n";
for( count = 0; count < argc; count++ )
cout << " argv[" << count << "] "
<< argv[count] << "\n";
}
Résultats de l’analyse des lignes de commande
Le tableau suivant présente un exemple d’entrée et de sortie attendue, illustrant les règles de la liste précédente.
Entrée de ligne de commande | argv[1] | argv[2] | argv[3] |
---|---|---|---|
"abc" d e |
abc |
d |
e |
a\\b d"e f"g h |
a\\b |
de fg |
h |
a\\\"b c d |
a\"b |
c |
d |
a\\\\"b c" d e |
a\\b c |
d |
e |
a"b"" c d |
ab" c d |
Développement des caractères génériques
Le compilateur Microsoft vous permet éventuellement d’utiliser des caractères génériques cartechar acters, le point d’interrogation (?
) et l’astérisque (*
), pour spécifier des arguments de nom de fichier et de chemin d’accès sur la ligne de commande.
Les arguments de ligne de commande sont gérés par une routine interne dans le code de démarrage du runtime, qui par défaut ne développe pas les caractères génériques carte dans des chaînes distinctes dans le argv
tableau de chaînes. Vous pouvez activer l’extension wild carte en incluant le setargv.obj
fichier (wsetargv.obj
fichier pour wmain
) dans vos /link
options de compilateur ou votre LINK
ligne de commande.
Pour plus d’informations sur les options de l’éditeur de liens de démarrage du runtime, consultez Options de lien.
Personnaliser le traitement en ligne de commande C++
Si votre programme ne prend pas d’arguments de ligne de commande, vous pouvez supprimer la routine de traitement de ligne de commande pour économiser une petite quantité d’espace. Pour supprimer son utilisation, incluez le fichier noarg.obj
(pour main
et wmain
) dans vos options de compilateur /link
ou votre ligne de commande LINK
.
De même, si vous n’accédez jamais à la table d’environnement par le biais de l’argument envp
, vous pouvez supprimer la routine de traitement de l’environnement interne. Pour supprimer son utilisation, incluez le fichier noenv.obj
(pour main
et wmain
) dans vos options de compilateur /link
ou votre ligne de commande LINK
.
Votre programme peut effectuer des appels à la famille de routines spawn
ou exec
dans la bibliothèque Runtime C. Si c’est le cas, vous ne devez pas supprimer la routine de traitement de l’environnement, car elle est utilisée pour transmettre un environnement du processus parent au processus enfant.
Voir aussi
Commentaires
https://aka.ms/ContentUserFeedback.
Bientôt disponible : Tout au long de 2024, nous allons supprimer progressivement GitHub Issues comme mécanisme de commentaires pour le contenu et le remplacer par un nouveau système de commentaires. Pour plus d’informations, consultezEnvoyer et afficher des commentaires pour