Réponses
Trop de publicités?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' getopt
s'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.
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
etargv
, 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 groupeargv[0]
parargv[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 parargv[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 deargc
est supérieur à un, les chaînes de caractères pointée parargv[1]
parargv[argc-1]
représentent les paramètres du programme.- Les paramètres
argc
etargv
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 commeint
, ou le type d'argv
peut être écrite commechar **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.
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.