Dans de nombreux compilateurs et IDE C++, quand il génère la fonction principale pour vous, cela ressemble à ceci:
int main(int argc, char *argv[])
Quand je code C++ sans IDE, uniquement avec un compilateur en ligne de commande, je tape:
int main()
sans aucun paramètre. Qu'est-ce que cela signifie et est-il vital pour mon programme?
argv
et argc
expliquent comment les arguments de ligne de commande sont passés à main()
en C et C++.
argc
sera le nombre de chaînes pointées par argv
. En pratique, il s'agira de 1 plus le nombre d'arguments, car pratiquement toutes les implémentations ajouteront le nom du programme au tableau.
Les variables sont nommées argc
(nombre d'arguments) et argv
(vecteur d'arguments), mais on peut leur attribuer tout identificateur valide: int main(int num_args, char** arg_strings)
est également valide.
Ils peuvent également être entièrement omis, donnant int main()
, si vous ne souhaitez pas traiter les arguments de ligne de commande.
Essayez le programme suivant:
#include <iostream>
int main(int argc, char** argv) {
std::cout << "Have " << argc << " arguments:" << std::endl;
for (int i = 0; i < argc; ++i) {
std::cout << argv[i] << std::endl;
}
}
L'exécuter avec ./test a1 b2 c3
affichera
Have 4 arguments:
./test
a1
b2
c3
argc
est le nombre d'arguments transmis à votre programme à partir de la ligne de commande et argv
est le tableau d'arguments.
Vous pouvez faire défiler les arguments en connaissant leur nombre, comme ceci:
for(int i = 0; i < argc; i++)
{
// argv[i] is the argument at index i
}
Supposons que vous exécutiez votre programme ainsi (en utilisant la syntaxe sh
):
myprog arg1 arg2 'arg 3'
Si vous avez déclaré votre fonction principale comme int main(int argc, char *argv[])
, alors (dans la plupart des environnements), votre main()
sera appelée comme si:
p = { "myprog", "arg1", "arg2", "arg 3", NULL };
exit(main(4, p));
Cependant, si vous avez déclaré votre fonction principale comme int main()
, elle s'appellera comme
exit(main());
et vous ne recevez pas les arguments.
Deux choses supplémentaires à noter:
main
. Si une plate-forme particulière accepte des arguments supplémentaires ou un type de retour différent, il s'agit d'une extension qui ne doit pas être utilisée dans un programme portable.*argv[]
et **argv
sont exactement équivalents, vous pouvez donc écrire int main(int argc, char *argv[])
comme int main(int argc, char **argv)
.Les paramètres de main
représentent les paramètres de ligne de commande fournis au programme lors de son démarrage. Le paramètre argc
représente le nombre d'arguments de la ligne de commande et char *argv[]
est un tableau de chaînes (pointeurs de caractères) représentant les arguments individuels fournis sur la ligne de commande.
La fonction main
peut avoir deux paramètres, argc
et argv
. argc
est un paramètre entier (int
), et correspond au nombre d'arguments transmis au programme.
Le nom du programme est toujours le premier argument, il y aura donc au moins un argument dans un programme et la valeur minimale de argc
sera égale à un. Mais si un programme a lui-même deux arguments, la valeur de argc
sera de trois.
Le paramètre argv
pointe sur un tableau de chaînes et est appelé le vecteur d'argument. C'est un tableau de chaînes unidimensionnel d'arguments de fonction.
Le premier paramètre est le nombre d'arguments fournis et le deuxième paramètre est une liste de chaînes représentant ces arguments.
int main();
Ceci est une simple déclaration. Il ne peut prendre aucun argument de ligne de commande.
int main(int argc, char* argv[]);
Cette déclaration est utilisée lorsque votre programme doit prendre des arguments de ligne de commande. Lorsqu'il est exécuté comme tel:
myprogram arg1 arg2 arg3
argc
, ou Argument Count, sera défini sur 4 (quatre arguments), et argv
, ou Argument Vectors, sera renseigné avec des pointeurs de chaîne sur "myprogram", "arg1", "arg2", et "arg3". L'invocation du programme (myprogram
) est incluse dans les arguments!
Alternativement, vous pouvez utiliser:
int main(int argc, char** argv);
Ceci est également valable.
Il y a un autre paramètre que vous pouvez ajouter:
int main (int argc, char *argv[], char *envp[])
Le paramètre envp
contient également des variables d'environnement. Chaque entrée suit ce format:
VARIABLENAME=VariableValue
comme ça:
Shell=/bin/bash
La liste des variables d'environnement est terminée par un zéro.
IMPORTANT: N'UTILISEZ aucune valeur argv
ou envp
directement dans les appels à system()
! Il s'agit d'un énorme trou de sécurité, car des utilisateurs malveillants pourraient définir des variables d'environnement comme des commandes de ligne de commande et (potentiellement) causer des dommages considérables. En général, n'utilisez pas system()
. Il y a presque toujours une meilleure solution implémentée via les bibliothèques C.
Les deux
int main(int argc, char *argv[]);
int main();
sont les définitions légales du point d'entrée d'un programme C ou C++. Stroustrup: FAQ sur les styles et techniques C++ détaille certaines des variations possibles ou légales pour votre fonction principale.