121 votes

Pourquoi devons-nous argc alors qu’il y a toujours une valeur null à la fin d’argv ?

Il semble que le est toujours , donc je pense que nous pouvons parcourir la liste d’arguments sans . Un seul boucle va le faire.

S’il y a toujours un à la fin de , pourquoi avons-nous besoin d’un `` ?

108voto

simonc Points 30279

Oui, argv[argc]==NULL est garanti. Voir C11 5.1.2.2.1 Programme de démarrage (mon emphase)

S'ils sont déclarés, les paramètres de la fonction main doit obéir les contraintes suivantes:

La valeur de argc doit être positif ou nul. argv[argc] est null pointeur.

Offrant argc n'est donc pas indispensable mais est toujours utile. Entre autres choses, il permet de rapidement vérifier que le bon nombre d'arguments a été adoptée.

Edit: La question a été modifiée pour inclure le C++. n3337 projet 3.6.1 fonction Principale dit

2 ...argc est le nombre d'arguments passés au programme de l'environnement dans lequel le programme est exécuté. .... La valeur de argc doit être non négatif. La valeur de argv[argc] sera de 0.

43voto

Yu Hao Points 40603

Oui, argv[argc] est garanti pour être un pointeur null. argc est utilisé à des fins de commodité.

Citant l'explication officielle de C99 Justification, notez les mots redondants vérifier:

Justification de la Norme Internationale - Langages de Programmation - C §5.1.2.2.1 démarrage du Programme

La spécification de l' argc et argv comme arguments au main reconnaît préalable approfondie de la pratique. argv[argc] est nécessaire pour être un pointeur null pour fournir une vérification redondants pour la fin de la liste, sur la base de la pratique courante.

19voto

José X. Points 653

C’est pour des raisons historiques et la compatibilité avec l’ancien code. A l’origine, n’était pas une garantie qu’il existerait un pointeur null tant que le dernier élément du tableau argv. Mais argc a toujours existé.

6voto

hyde Points 13720

Nous avons "besoin", parce qu'il est requis par les différentes normes.

Nous sommes libres d'ignorer totalement la valeur, mais depuis qu'il est premier paramètre de main, on doit l'avoir dans la liste de paramètres. En C++ (et probablement non-standard C dialectes), vous pouvez omettre le nom du paramètre, comme ceci C++ extrait de (facile à convertir à C):

#include <stdio.h> // C-compatible include, guarantees puts in global namespace

// program will print contents of argv, one item per line, starting from argv[0]

int main(int /*argc*/, char *argv[]) { // uncomment argc for C

    //(void)argc; // uncomment statement for C

    for (int i=0; argv[i]; ++i) {
        puts(argv[i]);
    }

    return 0;
}

En C standard, avec des paramètres d'avertissement, inutilisé paramètre génère avertissement, qui peut être fixé par une instruction comme celle - (void)argc; ce qui fait que le nom soit utilisé sans générer de code.

argc est agréable d'avoir, parce que sinon, de nombreux programmes ont besoin de marcher thorugh les paramètres pour obtenir le nombre. Aussi, dans de nombreux langages de programmation avec des tableaux qui ont la longueur, il n'est pas tout argc paramètre, il y a juste un tableau avec les éléments.

Prograide.com

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.

Powered by:

X