8
votes

Processus argc et argv en dehors de la principale ()

Si je veux garder la majeure partie de mon code pour traiter les arguments de ligne de commande hors (pour un code d'organisation et plus lisible), quelle serait la meilleure façon de le faire?

void main(int argc, char* argv[]){
    //lots of code here I would like to move elsewhere
}


0 commentaires

5 Réponses :


2
votes

passe simplement argc et argv comme arguments de la fonction dans lesquels vous souhaitez les traiter.

void parse_arg (int argc, char * argv []);


0 commentaires

4
votes

transmettez-les comme paramètres, ou de les stocker dans des variables globales. Tant que vous ne revenez pas du main et essayez de les traiter dans un Atexit code> gestionnaire ou le destructeur d'un objet à la portée mondiale, ils existent toujours et ira bien pour avoir accès à partir de toute portée. Par exemple: P>

// Global variables
int g_argc;
char **g_argv;

void process_command_line()
{
    // Use g_argc and g_argv
    ...
}

int main(int argc, char **argv)
{
    g_argc = argc;
    g_argv = argv;
    process_command_line();
    ...
}


0 commentaires

4
votes

On devrait garder aux normes partout où la pratique est pratique. Ainsi, n'écrivez pas xxx

qui n'a jamais été valide C ou C ++, mais écrivez plutôt xxx

avec cela, votre code peut compiler avec par exemple g ++ (avec options de compilateur habituelles).

Compte tenu du Void Main Je soupçonne un environnement Windows. Et de toute façon, afin de prendre en charge l'utilisation de votre programme dans un environnement Windows , vous ne devez pas utiliser les arguments principaux dans Windows. Ils travaillent dans * Nix parce qu'ils ont été conçus dans et pour cet environnement; ils ne fonctionnent pas en général dans Windows, car par défaut (par une convention très solide), ils sont codés sous forme de Windows ANSI, ce qui signifie qu'ils ne peuvent pas encoder des noms de fichiers avec des caractères en dehors de la locale actuelle de l'utilisateur.

pour Windows, vous ferez mieux d'utiliser le getcommandline fonction API et sa fonction d'analyse sœur. Pour la portabilité, cela devrait mieux être encapsulé dans un module d'arguments de ligne de commande. Ensuite, vous devez faire face au problème intéressant d'utiliser wchar_t sous Windows et char in * nix ...

Quoi qu'il en soit, je ne suis pas sûr de la correspondance * Nix API, ou même s'il en existe un, mais Google it. Dans le pire des cas, pour * Nix, vous pouvez toujours initialiser un module d'arguments de ligne de commande à partir de principal . La laideur pour * Nix découle directement de la nécessité de prendre en charge la portabilité avec la construction spécifique au système d'exploitation de C ++, nommément standard principal


2 commentaires

Je suis tout à fait d'accord avec int Principal sur void principal . Cependant, l'autre commentaire me laisse ... Bemusé. Quel système autre que Windows a un problème avec la convention C ++ standard pour principale () ? Je ne suis pas au courant d'un, de sorte que la convention standard, comme «non portable» et «spécifique au système d'exploitation», semble OTT.


@Jonathanleffler: Je ne suis pas au courant d'un système couramment utilisé autre que Windows où les arguments principaux ne fonctionnent pas (autres que pour l'alphabet anglais PURE ASCII Texte). Néanmoins, une fonctionnalité qui ne fonctionne pas dans Windows est non portable et une fonctionnalité conçue pour UNIX-Land est Spécifique du système d'exploitation. Et la convention d'arguments ne fonctionne pas dans Windows (c'est-à-dire non portable) et est conçu pour UNIX-Terre (c'est-à-dire spécifique au système d'exploitation), et ces deux aspects sont fortement liés. Il n'y a absolument rien d'amuser à ce sujet. Je ne peux penser que des raisons politiques laides de sa persistance.



0
votes

Consultez le " GETOPTLONG "Famille de fonctions et de bibliothèques. Celles-ci offrent une manière structurée de définir les arguments que votre programme attend et peut ensuite les analyser facilement pour vous. Peut également aider avec la génération de documentation / réponses d'aide.

C'est une vieille bibliothèque dans le monde Unix, et il y a aussi une implémentation .NET en C #. (+ Perl, Ruby, et probablement plus. Bien d'avoir un seul paradigme utilisable à tous! Apprenez une fois, utilisez partout!)


0 commentaires

0
votes

linux fournit programme_invocation_name et programme_invocation_name_short .


0 commentaires