108 votes

Pourquoi argc est pas une constante ?

<pre><code></code><p><a href="http://rads.stackoverflow.com/amzn/click/0321334876">C++ efficace</a> <code></code> « ?.</p><p><code></code>a été modifiée en un programme ?</p></pre>

118voto

Joe Z Points 10783

Dans ce cas, l'histoire est un facteur. C défini ces entrées comme "non constante", et la compatibilité avec (une bonne partie) du code C était un but rapide de C++.

Certaines Api UNIX, telles que l' getopt, effectivement le faire manipuler argv[], de sorte qu'il ne peut pas être const , pour cette raison également.

(Aparté: il est Intéressant de noter, bien qu' getopts'prototype suggère de ne pas modifier argv[] mais peut modifier les chaînes pointées, le Linux page de manuel indique qu' getopt permute ses arguments, et il semble qu'ils savent qu'ils sont vilains. La page de man à l'Open Group ne fait pas mention de cette permutation.)

Mettre const sur argc et argv n'achète pas beaucoup, et il rendrait certains de la vieille école pratiques de programmation, tels que:

// print out all the arguments:
while (--argc)
    std::cout << *++argv << std::endl;

J'ai écrit des programmes en C, et je sais que je ne suis pas le seul. J'ai copié l'exemple de quelque part.

38voto

Jonathan Leffler Points 299946

La norme (ISO/IEC 9899:2011) dit:

5.1.2.2.1 démarrage du Programme

¶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 sera défini avec le type de retour de type int et sans paramètres:

int main(void) { /* ... */ }

ou avec deux paramètres (dénommée ci - argc et argv, bien que les noms peuvent être utilisées car elles sont locales à la fonction dans laquelle elles sont déclarées):

int main(int argc, char *argv[]) { /* ... */ }

ou l'équivalent;10) ou dans certains autres définis par l'implémentation.

¶2 Si elles sont déclarées, les paramètres de l' main fonction doit obéir à la suivante contraintes:

  • La valeur de argc doit être positif ou nul.
  • argv[argc] doit être un pointeur null.
  • Si la valeur de argc , est supérieure à zéro, les membres du groupe argv[0]par argv[argc-1] inclusive doit contenir des pointeurs vers des chaînes, qui sont donnés mise en œuvre-les valeurs définies par l'hôte de l'environnement avant le démarrage du programme. L' l'intention est de fournir de l'information sur le programme les a préalablement déterminés avant le démarrage du programme d'ailleurs dans l'environnement hébergé. Si l'hôte de l'environnement n'est pas capable de la fourniture de chaînes de caractères avec des lettres à la fois des majuscules et des minuscules, la mise en œuvre veillent à ce que les chaînes sont reçues en minuscules.
  • Si la valeur de argc , est supérieure à zéro, la chaîne pointée par argv[0] représente le nom du programme; argv[0][0] doit être le caractère null si l' nom du programme n'est pas disponible à partir de l'hôte de l'environnement. Si la valeur de argcest supérieur à un, les chaînes de caractères pointée par argv[1] par argv[argc-1] représentent les paramètres du programme.
  • Les paramètres argc et argv et les chaînes pointées par l' argv tableau est être modifiable par le programme, et de conserver leur dernier-valeurs stockées entre programme de démarrage et de fin de programme.

10) Ainsi, int peut être remplacé par un typedef nom défini comme int, ou le type d' argv peut être écrite comme char **argv, et ainsi de suite.

Notez que le dernier point. Il est dit que les deux argc et argv doit être modifiable. Ils n'ont pas à être modifiés, mais ils peuvent être modifiés.

24voto

razeh Points 940

n’est pas normalement une constante parce que la signature de fonction pour dates pré `` .

Argc étant une variable pile, changer il n’affectera pas autre chose que le traitement de votre propre ligne de commande.

Vous êtes, bien sûr, libre du pour déclarer `` si vous voulez.

8voto

Un haut niveau d' const sur un argument formel ne fait pas partie de la fonction type. Vous pouvez ajouter ou supprimer comme vous le souhaitez: il n'affecte que ce que vous pouvez faire avec l'argument de la fonction de mise en œuvre.

Donc, pour argc vous pouvez ajouter librement ajouter un const.

Mais pour l' argv vous ne pouvez pas rendre le personnage de données const sans pour autant changer la signature de la fonction. Ce qui signifie qu'il est alors pas un de la norme main des signatures de fonction, et n'aura pas à être reconnu comme un main fonction. Donc, pas une bonne idée.


Une bonne raison pour ne pas utiliser la norme main arguments au non-jouet programmes est que dans Windows, ils ne sont pas en mesure de représenter la réalité du programme des arguments tels que les noms de fichiers avec des caractères internationaux. C'est parce que dans Windows, ils sont en très forte de la convention codé comme Windows ANSI. Dans Windows, vous pouvez mettre en œuvre certaines plus portable argument de la facilité d'accès en termes de GetCommandLine fonction de l'API.


En résumé, rien ne vous empêche d'ajouter const de argc, mais les plus utiles, const-ness sur argv serait de vous donner un non-standard main de la fonction, la plupart probablement pas reconnu en tant que tel. Heureusement (d'une manière ironique) il y a de bonnes raisons de ne pas utiliser la norme main arguments pour portable graves de code. Tout simplement, pour la pratique, ils prennent uniquement en charge les vieux ASCII, avec seulement l'anglais lettres de l'alphabet.

4voto

George Points 4207

La signature de est en quelque sorte un artefact historique de . Historiquement ne .

Toutefois, vous pouvez déclarer votre paramètre `` étant donné que les effets de const sont moment de la compilation uniquement.

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