web-dev-qa-db-fra.com

Est-il prudent de renommer argc et argv dans la fonction principale?

Beaucoup de programmes utilisent des noms standard pour un certain nombre d'arguments et de tableaux de chaînes. Le prototype de la fonction principale ressemble à ceci: int main(int argc, char *argv[]);. Mais est-ce que je casserais quelque chose si je choisissais des noms personnalisés pour ces variables?

Par exemple. int main(int n_of_args, char *args[]);

Dans le contexte du compilateur, tout va bien. Ces variables sont locales pour la fonction principale, elles peuvent donc avoir des noms. Et le code simple construit et fonctionne parfaitement. Mais ces noms peuvent être utilisés par le préprocesseur. Alors, est-il prudent de renommer ces arguments?

PSPersonnellement, je trouve ces noms mauvais, car ils se ressemblent beaucoup et ne diffèrent que par une lettre. Mais tout le monde les utilise pour une raison quelconque.

80
yanpas

Oui, c'est sûr, tant que vous utilisez des noms de variables valides. Ce sont des variables locales, donc leur portée ne va pas au-delà de la fonction main.

À partir de la section 5.1.2.2.1 de la norme C :

La fonction appelée au démarrage du programme s'appelle main. Le l'implémentation ne déclare aucun prototype pour cette fonction. Cela devrait être défini avec un type de retour de int et sans paramètre:

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

ou avec deux paramètres (appelés ici argc et argv, bien que tous les noms puissent être utilisés, car ils sont locaux à la fonction dans laquelle ils sont declare):

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

ou équivalent; ou d'une autre manière définie par l'implémentation

Cela étant dit, utiliser autre chose que argc et argv pourrait dérouter les autres lecteurs de votre code qui sont habitués aux noms classiques de ces paramètres. Donc, mieux vaut pécher par excès de clarté.

117
dbush

Les noms argc et argv ont en fait été prescrits par le standard C++ avant C++ 11. Il a déclaré:

Toutes les implémentations doivent permettre les deux définitions suivantes de principal:

int main ()

et

int main ( int argc , char * argv [])

et a poursuivi en discutant des exigences sur argc et argv.

Donc techniquement, tout programme utilisant des noms différents n'était pas conforme à la norme, et le compilateur était autorisé à le rejeter. Bien entendu, aucun compilateur ne l'a fait. Voir ce fil sur comp.std.c ++ , ou la section 3.6.1 de ce projet de norme C++ 03 .

C’était presque certainement un simple oubli et a été modifié en C++ 11, qui dit plutôt

Toutes les implémentations doivent permettre à la fois

  • une fonction de () retournant int et
  • une fonction de (int, pointeur à pointeur sur char) retournant int

comme type de main (8.3.5). Sous cette dernière forme, aux fins de exposition, le premier paramètre de fonction est appelé argc et le second Le paramètre de fonction s'appelle argv,…

37
Kundor

Bien sûr, vous pouvez renommer ces paramètres en toute sécurité à votre guise 

 int main(int wrzlbrnft, char* _42[]) {
 }

Les noms sont écrits dans le sable. Ils n'ont aucune influence sur le code finalement compilé.


La seule chose qui compte est que les types de paramètres de déclaration et de définition correspondent réellement.

La signature de la fonction main() est intrinsèquement déclarée comme

 int main(int, char*[]);

si vous avez besoin de les utiliser dans une implémentation, vous devrez les nommer. Les noms utilisés sont en réalité sans importance, comme mentionné précédemment.

28

Oui. C'est sûr, ça fait bizarre, mais ça ne casse rien. 

15
coredump

Oui, vous pouvez utiliser des noms différents en toute sécurité.

Personnellement, je ne le recommanderais pas, car les variables argc et argv sont si largement connues et familières de tous les programmeurs C susceptibles de travailler avec votre code. À long terme, utiliser vos propres noms spéciaux et différents causera beaucoup plus de confusion et/ou de frustration parmi vos lecteurs que cela ne vous épargnera jamais parce que vous préférez vos noms.

"A Rome, fais comme les Romains."

7
Steve Summit

Oui, vous pouvez les renommer comme vous le souhaitez. Ce sont simplement des noms de paramètres de fonction, rien de plus.

5
orbitcowboy

Je pense que tout le monde a bien maîtrisé les règles techniques du c ++: la réponse est oui. Laissons de côté la tradition et le fait que cette fonction 1 est particulière et iconique et contient des points valables pour ne pas changer sur cette base.

Souvent, j’ai le sentiment que la philosophie des choix est rarement discutée et je voulais donc offrir une perspective sur cette question, car j’estime qu’elle est importante pour la raison pour laquelle il a été demandé de commencer.

Cette question à moi implique un choix dans l'expression de l'anglais dans le code en général. Vous semblez être dérangé par les descriptions de la main courte, en particulier, si la main courte atterrit un texte similaire. Dans votre exemple cependant, changer d'argn en n_of_args accomplit uniquement le changement d'un type de raccourci en une autre forme de raccourci sans réelle valeur ajoutée: clarification ou autres propriétés visibles.

Le mot "numéro" a été remplacé par une lettre "n".

Si vous modifiez un nom de main abrégée via la philosophie de anti-main abrégée, quelque chose comme cela peut sembler plus approprié:

main (int argumentCount, char ** argumentVector)

Je pense toujours à deux choses: Nommer les choses par ce qu’elles sont et/ou par leur utilisation implicite. L'appeler argumentVector est redondant pour moi puisque la propriété d'être un vecteur est impliquée par le double indirection **. Ainsi, une meilleure main longue pour écrire le code est la suivante: ** arguments. 

Certains diront que la variable nommée argumentCount est déclarée en tant qu'int et qu'un compte ne peut pas être négatif, mais vous pouvez avoir un entier négatif {unsigned is better}. 

Encore une fois, ce qu’il est et comment il est utilisé joue dans cette interprétation. Si c'est un compte, alors je suppose que cela ne sera jamais négatif. Après tout, comment pouvez-vous avoir un compte de -2 pommes. Je dirais que vous devez deux pommes. Si c'est un nombre, alors je m'attendrais à ce qu'un cas négatif soit possible. C'est pourquoi le mot supplémentaire 'of' est probablement important pour vous. Cela, et peut-être un numéro auquel une collection fait référence, implique un élément spécifique plutôt qu'une propriété de la collection elle-même. Ie: argumentsNumber = 5 implique un argument spécifique mais pas numberOfArguments.

main (int maxArgumentsIndex, arguments char **).

Cela supprime l'ambiguïté. L'appeler un index supprime l'ambiguïté de la casse négative et décrit également ce que c'est, et comment l'utiliser. Cela implique également par la formulation anglaise qu'un max est un absolu et donnerait l'impression d'un code étrange qui modifie cette valeur (il doit être const). Le terme "arguments" a du sens ici car il est pluriel, il décrit ce qu'il est et comment il devrait déjà être utilisé. Même interpréter de cette façon peut être dangereux, car un index correspond à -1 d'un nombre/nombre/nombre. 5 arguments donnent un maxIndex de 4 !!

Toute autre fonction et j'utiliserais complètement:

fonction void (const unsigned int maxArgumentsIndex, const char ** arguments)

Toutes les situations ne méritent pas de longs descripteurs. En fait, quelques fois une main courte donne plus de lisibilité, en particulier pour écrire des cours de maths tels que Vec3f, Matrix, Quaternion, etc. . float x, y, z vrs. float xComponent et similaires.

Je comprends que tout ceci est un choix de style, mais être conscient de ces choix aidera vraiment à long terme. Je garantis que les programmeurs chevronnés seront dérangés lorsque les tableaux ne sont pas écrits au pluriel, mais encore une fois, main est une prose spéciale de l'existence;)

3
JMan Mousey

Conformément aux normes C, vous pouvez renommer Oui, rien ne va avoir d’impact. Si j'ai bien compris, en langage C, les noms de mots-clés/types/jetons par défaut ont été définis avec un objectif/usage, donc de la même manière que les noms définis 

argc --> argument count

argv --> argument vector

ce qui est également logique en termes d’utilisation. Vous pouvez donc modifier le nom de votre choix/Reserved names 

En GCC, l’exécution du programme commence par le nom de la fonction main. Cela ne dépend pas de ses paramètres.

Lorsque vous écrivez un programme autonome pour micro-contrôleurs, vous n'avez pas besoin de vous soucier du nom main mais vous pouvez définir votre propre name et modifier le point d'entrée de l'Assemblée pour qu'il pointe votre fonction. Cela dépend du compilateur du contrôleur et de la disponibilité du code source prédéfini du contrôleur. Je l'ai fait dans le contrôleur Freescale sous Code-warrior.

Ma note:

Il est préférable de suivre les normes/styles de code courants pour rendre le code plus visible et lisible. 

2
ntshetty

C'est sans danger pour le compilateur.

Le seul problème que cela peut causer est la confusion. Les personnes qui liront votre code s'attendent à ce que ces deux variables portent leur nom standard. Vous pouvez même faire quelque chose comme ça:

int main(int foo, char ** bar)
{
    int argc;
    float argv;

Mais je ne pense pas avoir besoin de dire à quel point cette pratique serait mauvaise.

0
Broman