arguments de ligne de commande d'accès sans utiliser char ** argv dans le principal

StackOverflow https://stackoverflow.com/questions/2471553

  •  20-09-2019
  •  | 
  •  

Question

est à principal il un moyen d'accéder aux arguments de ligne de commande, sans utiliser l'argument? Je dois y accéder dans une autre fonction, et je le préfère ne pas passer dans.

J'ai besoin d'une solution qui ne fonctionne que nécessairement Mac OS et Linux avec GCC.

Était-ce utile?

La solution

Je ne pense pas que vous devriez le faire comme le moteur d'exécution C préparera les arguments et le transmettre dans la principale via int argc, char **argv, ne tentez pas de manipuler le comportement par le piratage en place car il serait largement le comportement non portable ou peut-être non défini! ! Tenez-vous aux règles et vous aurez la portabilité ... aucune autre façon de le faire autre que casser ...

Autres conseils

Je ne sais pas comment le faire sur Mac OS, mais je soupçonne le truc que je vais décrire ici peut être porté à MacOS avec un peu de lecture croisée.

Sur linux vous pouvez utiliser la soi-disant section « .init_array » du binaire ELF, pour enregistrer une fonction qui est appelée pendant initilization du programme (avant principal () est appelée). Cette fonction a la même signature que la fonction principale () normale, execept retourne « vide ». Ainsi, vous pouvez utiliser cette fonction pour ne pas oublier ou processus argc, argv [] et evp [].

Voici un code que vous pouvez utiliser:

static void my_cool_main(int argc, char* argv[], char* envp[])
{
    // your code goes here
}

__attribute__((section(".init_array"))) void (* p_my_cool_main)(int,char*[],char*[]) = &my_cool_main;

PS: Ce code peut également être mis dans une bibliothèque, il devrait donc s'adapter à votre cas. Il fonctionne même lorsque votre prgram est exécuté avec valgrind -. Valgrind ne fourche pas un nouveau processus, et cela se traduit dans / proc / auto / cmdline montrant la ligne de commande valgrind originale

PPS: Gardez à l'esprit que pendant ce très tôt l'exécution du programme beaucoup de sous-système ne sont pas encore complètement initialisé - j'ai essayé libc routines d'E / S, ils semblent fonctionner, mais ne comptez pas sur elle - même les variables Gloval pourraient ne pas encore construire, etc ...

Vous pouvez les copier dans les variables globales si vous voulez.

Dans Linux, vous pouvez ouvrir /proc/self/cmdline (en supposant que /proc est présent) et analysez manuellement (ce qui est nécessaire uniquement si vous avez besoin argc / argv avant main() - par exemple dans un constructeur mondial - sinon il est mieux les passer par vars globales).

Plus de solutions sont disponibles ici: http://blog.linuxgamepublishing.com/2009/10/12/argv-and-argc-and-just-how-to-get-them/

Oui, il est brut et non portable, mais si vous résoudre des problèmes pratiques que vous ne se soucient pas.

Vous pouvez. La plupart des plates-formes offrent des variables globales __argc et __argv. Mais encore une fois, je soutiens le commentaire de zneak.

P.S. Utilisez boost :: program_options pour les analyser. S'il vous plaît ne pas le faire d'une autre façon en C ++.

Y at-il une raison pour laquelle le passage d'un pointeur vers l'espace qui est déjà consommé est si mauvais? Vous ne serez pas obtenir des économies réelles sur l'élimination de l'argument de la fonction en question et vous pouvez déclencher une exposition très intéressante de feux d'artifice. Contournant autour de la pile d'appels de main () avec la création se termine généralement carriole dans un comportement non défini, ou le recours à un comportement spécifique du compilateur. Les deux sont mauvais pour la fonctionnalité et la portabilité respectivement.

Gardez à l'esprit les arguments en question sont pointeurs aux arguments, ils vont consommer de l'espace, peu importe ce que vous faites. La commodité d'un indice d'entre eux est aussi pas cher que sizeof (int), je ne vois aucune raison de ne pas l'utiliser.

On dirait que vous optimisez plutôt agressive et prématurément, ou vous êtes coincé avec avoir à ajouter des fonctionnalités dans le code que vous ne voulez vraiment pas salir avec. Dans les deux cas, faire des choses sera conventionnellement économiser du temps et des problèmes.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top