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 }
5 Réponses :
passe simplement argc code> et
argv code> comme arguments de la fonction dans lesquels vous souhaitez les traiter. P>
void parse_arg (int argc, char * argv []); code> p>
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();
...
}
On devrait garder aux normes partout où la pratique est pratique. Ainsi, n'écrivez pas qui n'a jamais été valide C ou C ++, mais écrivez plutôt p> avec cela, votre code peut compiler avec par exemple Compte tenu du pour Windows, vous ferez mieux d'utiliser le 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 g ++ code> (avec options de compilateur habituelles). P>
Void Main code> 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 em>, vous ne devez pas utiliser les arguments code> principaux code> 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. P>
getcommandline code>
strong> 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 code> sous Windows et
char code> in * nix ... p>
principal code>. 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 p> p> p>
Je suis tout à fait d'accord avec int Principal code> sur
void principal code>. Cependant, l'autre commentaire me laisse ... Bemusé. Quel système autre que Windows a un problème avec la convention C ++ standard pour
principale () code>? 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 code> principaux code> ne fonctionnent pas (autres que pour l'alphabet anglais PURE ASCII Texte). Néanmoins, une fonctionnalité qui ne fonctionne pas dans Windows est B> non portable et une fonctionnalité conçue pour UNIX-Land est B> Spécifique du système d'exploitation. Et la convention d'arguments code> code> code> 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.
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. P>
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!) P>
linux fournit programme_invocation_name code> et
programme_invocation_name_short code>. p>