Frage

Gibt es eine Möglichkeit, auf die Befehlszeilenargumente zuzugreifen, ohne das Argument für Main zu verwenden? Ich muss in einer anderen Funktion darauf zugreifen, und ich würde es vorziehen, es nicht einzugeben.

Ich brauche eine Lösung, die nur notwendigerweise unter Mac OS und Linux mit GCC funktioniert.

War es hilfreich?

Lösung

Ich glaube nicht int argc, char **argv, Versuchen Sie nicht, das Verhalten zu manipulieren, indem Sie es hacken, da es weitgehend unportierbar oder möglicherweise undefiniertes Verhalten wäre !! Halten Sie sich an die Regeln und Sie werden Portabilität haben ... keine andere Möglichkeit, es zu tun, als sie zu brechen ...

Andere Tipps

Ich weiß nicht, wie ich es auf MacOS machen soll, aber ich vermute, dass der Trick, den ich hier beschreiben werde, mit ein wenig Kreuzlesen auf macOS portiert werden kann.

Unter Linux können Sie den Abschnitt ".init_array" des Elf -Binary verwenden, um eine Funktion zu registrieren, die während der Programminitilisierung aufgerufen wird (bevor Main () aufgerufen wird). Diese Funktion hat die gleiche Signatur wie die normale Main () -Funktion, die sie "void" zurückgibt. Daher können Sie diese Funktion verwenden, um Argc, Argv [] und EVP [] zu erinnern oder zu verarbeiten.

Hier ist ein Code, den Sie verwenden können:

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: Dieser Code kann auch in eine Bibliothek gesteckt werden, sodass er zu Ihrem Fall passt. Es funktioniert sogar, wenn Ihr Prgram mit Valgrind ausgeführt wird - Valgrind gibt keinen neuen Prozess aus, und dies führt zu/proc/self/cmdline, die die ursprüngliche Befehlszeile von Valgrind anzeigen.

PPS: Denken Sie daran, dass während dieser sehr frühen Programmausführung viele Subsysteme noch nicht vollständig initialisiert sind - ich habe versucht, LIBC -I/A -Routinen zu funktionieren, sie scheinen zu funktionieren, aber ich bin nicht darauf angewiesen - sogar Glovalvariablen sind noch nicht konstruiert. etc...

Sie können sie in globale Variablen kopieren, wenn Sie möchten.

In Linux können Sie sich öffnen /proc/self/cmdline (vorausgesetzt, dass /proc ist vorhanden) und manuell analysieren (dies ist nur erforderlich, wenn Sie Argc/Argv benötigen Vor main() - zB in einem globalen Konstruktor - wie sonst ist es besser, sie über globale Vars zu bestehen).

Weitere Lösungen finden Sie hier: http://blog.linuxgamepublishing.com/2009/10/12/argv-and-argc-and-just-how-thoden-them/

Ja, es ist grob und unportierbar, aber wenn Sie praktische Probleme lösen, kümmert Sie sich vielleicht nicht.

Du kannst. Die meisten Plattformen bieten globale Variablen __ARGC und __ARGV. Aber auch hier unterstütze ich Zneaks Kommentar.

PS Verwenden Sie Boost :: Program_Options, um sie zu analysieren. Bitte machen Sie es in C ++ nicht anders.

Gibt es einen Grund, warum es so schlimm ist, einen Zeiger an den bereits konsumierten Raum zu bringen? Sie werden keine wirklichen Einsparungen bei der Beseitigung des Arguments an die fragliche Funktion erhalten und können eine interessante Anzeige von Feuerwerkskörpern ausführen. Der Call -Stack von Main () mit kreativem Hackery endet normalerweise in undefiniertem Verhalten oder Vertrauen in das spezifische Verhalten von Compiler. Beide sind schlecht für Funktionen bzw. Portabilität.

Denken Sie daran, dass die fraglichen Argumente sind Zeiger In Argumenten werden sie Raum nutzen, egal was Sie tun. Die Bequemlichkeit eines Index von ihnen ist so billig wie die Größe (int). Ich sehe keinen Grund, ihn nicht zu verwenden.

Es hört sich so an, als würden Sie ziemlich aggressiv und vorzeitig optimieren, oder Sie müssen Funktionen in Code hinzufügen, mit denen Sie sich wirklich nicht anlegen möchten. In beiden Fällen speichert es sowohl Zeit als auch Schwierigkeiten, die Dinge konventionell zu tun.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top