Ce n'int argc, char *argv[] signifie?
dans beaucoup de C++ IDE et compilateurs, quand il génère la fonction principale pour vous, il ressemble à ceci:
int main(int argc, char *argv[])
quand je code C++ sans IDE, juste avec un compilateur en ligne de commande, je tape:
int main()
sans aucun paramètre. Qu'est-ce que cela signifie, et c'est vital pour mon programme?
8 réponses
argv
et argc
sont comment les arguments de ligne de commande sont transmis à main()
en C et C++.
argc
sera le nombre de cordes pointées par argv
. Ceci sera (en pratique) 1 plus le nombre d'arguments, puisque pratiquement toutes les implémentations vont pré-coller le nom du programme au tableau.
Les variables sont nommées argc
( "1519170920 argument de" compter ) et argv
( argument vector ) par convention, mais ils peuvent être donnés n'importe quel identifiant valide: int main(int num_args, char** arg_strings)
est également valide.
ils peuvent aussi être entièrement omis, donnant int main()
, si vous n'avez pas l'intention de traiter des arguments en 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
produira
Have 4 arguments:
./test
a1
b2
c3
argc
est le nombre d'arguments transmis dans votre programme depuis la ligne de commande argv
est le tableau d'arguments.
vous pouvez boucler les arguments en sachant le nombre d'entre eux comme:
for(int i = 0; i < argc; i++)
{
// argv[i] is the argument at index i
}
supposons que vous exécutez votre programme ainsi (en utilisant la syntaxe sh
):
myprog arg1 arg2 'arg 3'
si vous avez déclaré votre main comme int main(int argc, char *argv[])
, alors (dans la plupart des environnements), votre main()
sera appelé comme si comme:
p = { "myprog", "arg1", "arg2", "arg 3", NULL };
exit(main(4, p));
cependant, si vous avez déclaré votre main comme int main()
, il sera appelé quelque chose comme
exit(main());
et vous ne faites pas passer les arguments.
deux autres points à noter:
- il s'agit des deux seules signatures normalisées pour
main
. Si une plate-forme particulière accepte des arguments supplémentaires ou un type de retour différent, alors c'est une extension et ne devrait pas être utilisé dans un programme portable. -
*argv[]
et**argv
sont exactement équivalentes, de sorte que vous pouvez écrireint main(int argc, char *argv[])
commeint 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 en ligne de commande, et char *argv[]
est un tableau de chaînes (pointeurs de caractères) représentant les arguments individuels fournis en ligne de commande.
le premier paramètre est le nombre d'arguments fournis et le second paramètre est une liste de chaînes représentant ces arguments.
la fonction main
peut avoir deux paramètres, argc
et argv
. argc
est un paramètre entier ( int
), et c'est le nombre d'arguments passés au programme.
Le nom du programme est toujours le premier argument, il y aura au moins un argument d'un programme et la valeur minimale de argc
. Mais si un programme a lui-même deux arguments la valeur de argc
sera trois.
paramètre argv
pointe vers un tableau de chaînes de caractères et est appelé le argument vector . C'est un tableau de chaîne de caractères unidimensionnel des arguments de fonction.
int main();
C'est une simple déclaration. Il ne peut accepter aucun argument en ligne de commande.
int main(int argc, char* argv[]);
cette déclaration est utilisée lorsque votre programme doit prendre des arguments en ligne de commande. Quand on court comme ça:
myprogram arg1 arg2 arg3
argc
, ou le nombre D'arguments, sera défini à 4 (quatre arguments), et argv
, ou Vecteurs D'arguments, sera peuplé avec des pointeurs de chaîne de caractères à "myprogram", "arg1", "arg2", et "arg3". le l'invocation de 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 ceci:
SHELL=/bin/bash
la liste des variables d'environnement est nulle.
IMPORTANT: N'utilisez pas de valeurs argv
ou envp
directement dans les appels à system()
! Il s'agit d'un énorme trou de sécurité que les utilisateurs malveillants pourraient définir des variables d'environnement aux commandes en ligne de commande et (potentiellement) causer des dommages massifs. En général, n'utilisez pas system()
. Il y a presque toujours une meilleure solution mise en œuvre par l'intermédiaire des bibliothèques C.
les deux de
int main(int argc, char *argv[]);
int main();
sont des définitions légales du point d'entrée d'un programme C ou C++. Stroustrup: C++ Style And Technique FAQ détaille certaines des variations qui sont possibles ou légales pour votre fonction principale.