Compte tenu de la définition standard du programme principal:
int main(int argc, char *argv[]) {
...
}
Dans quelles circonstances argc
peut-il être nul sur un système POSIX?
Compte tenu de la définition standard du programme principal:
int main(int argc, char *argv[]) {
...
}
Dans quelles circonstances argc
peut-il être nul sur un système POSIX?
Oui, c'est possible. Si vous appelez votre programme de la façon suivante:
execl("./myprog", NULL, (char *)NULL);
Ou alternativement:
char *args[] = { NULL };
execv("./myprog", args);
Puis dans "myprog", argc
sera de 0.
La norme permet également spécifiquement pour un 0 argc
comme mentionné dans la section 5.1.2.2.1 concernant le démarrage du programme dans un environnement hébergé:
1 La fonction appelée au démarrage du programme est nommé
main
. La mise en œuvre déclare aucun prototype de cette fonction. Il doit être défini avec un type de retour d'int
et sans paramètres:int main(void) { /* ... */ }
ou avec deux paramètres (dénommée ci -
argc
etargv
, bien que les noms peuvent être utilisés, qu'ils soient locaux pour la fonction dans laquelle elles sont déclarées):int main(int argc, char *argv[]) { /* ... */ }
ou l'équivalent; ou dans certains autres de la mise en œuvre-définis.
2 Si elles sont déclarées, les paramètres de l'
main
fonction doit répondre aux contraintes suivantes:
- La valeur de
argc
doit être positif ou nul.argv[argc]
doit être un pointeur null....
Notez également que cela signifie que si argc
est 0, argv[0]
est garanti pour être NULL. Comment printf
traite un pointeur NULL si elle est utilisée comme argument d'une %s
spécificateur n'est pas précisée dans la norme mais. De nombreuses implémentations de sortie "(null)" dans ce cas, mais je ne crois pas que c'est garanti.
Oui, il peut être égal à zéro, ce qui signifie qu' argv[0] == NULL
.
C'est une convention qui argv[0]
est le nom du programme.
Vous pouvez avoir argc == 0
si vous vous lancer le binaire, comme avec execve de la famille et ne donnez aucun argument. Vous pouvez même donner une chaîne de caractères qui est loin d'être le nom du programme. C'est pourquoi l'utilisation d' argv[0]
pour obtenir le nom du programme n'est pas entièrement fiable.
Généralement, la coquille où vous tapez votre ligne de commande toujours ajouter le nom du programme que le premier argument, mais encore une fois, c'est une convention. Si argv[0]
== "--help" et que vous utilisez getopt pour analyser option, vous ne le détecte pas, car optind
est initialisé à 1, mais vous pouvez configurer optind
0, utilisez getopt
et "aide" de l'option s'affichera.
longue histoire courte : Il est parfaitement possible d'avoir argc == 0
(argv[0]
n'est pas vraiment elle-même). Il arrive quand le lanceur ne donne pas d'argument à tous.
Les premières propositions nécessaire que la valeur de argc passé de main() être "un ou plus". Elle était motivée par la même exigence dans les projets de le C ISO standard. En fait, l'historique des implémentations ont passé une la valeur zéro lorsque aucun argument n'est fourni à l'appelant de l'exec fonctions. Cette exigence a été supprimée à partir de l'ISO C standard et par la suite retirés de ce volume de POSIX.1-2017 ainsi. L' formulation, en particulier, l'usage de la parole, exige un strict Conforme POSIX Demande de passer au moins un argument à l'exec de la fonction, afin de garantir que argc être un, ou une plus grande lorsqu'il est appelé par une telle demande. En fait, c'est une bonne pratique, car de nombreux les applications existantes de référence argv[0] sans vérifier d'abord le la valeur de argc.
L'exigence Strictement Conforme POSIX Application indique également que la valeur passée comme premier argument un nom de fichier de la chaîne associé avec le processus en cours de démarrage. Bien que certains applications de passer un chemin plutôt qu'un nom de fichier de la chaîne dans certains circonstances, un nom de fichier de la chaîne est plus généralement utile, car les utilisation courante de argv[0] est dans l'impression de diagnostics. Dans certains cas, l' nom de fichier passé n'est pas le véritable nom du fichier; par exemple, de nombreuses implémentations de la connexion de l'utilitaire d'utiliser une convention de la préfixation de a ( '-' ) pour le nom de fichier réel, qui indique à l'interpréteur de commande invoquée que c'est un "login shell".
Aussi, notez que le test et [ utilitaires nécessitent des chaînes spécifiques pour la argv[0] argument avoir déterministe des comportements à travers tous les les implémentations.
Peut argc être zéro sur un système POSIX?
Oui, mais il ne serait pas strictement conforme à POSIX.
chaque fois que vous voulez exécuter un exécutable comme ./a.out
il aura un argument qui est le program name
. Mais il est possible d'exécuter un programme avec argc
comme zero
sous Linux, en l'exécutant à partir d'un autre programme qui appelle execv
avec un empty argument list
.
par exemple
int main() {
char *buf[] = { NULL };
execv("./exe", buf); /* exe is binary which it run with 0 argument */
return 0;
}
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.