Domanda

Esiste un modo per accedere agli argomenti della riga di comando, senza utilizzare l'argomento principale?Devo accedervi in ​​un'altra funzione e preferirei non passarlo.

Ho bisogno di una soluzione che funzioni necessariamente solo su Mac OS e Linux con GCC.

È stato utile?

Soluzione

Non penso che dovresti farlo poiché il runtime C preparerà gli argomenti e li passerà al via principale int argc, char **argv, non tentare di manipolare il comportamento modificandolo poiché sarebbe in gran parte un comportamento non trasportabile o forse indefinito!!Rispetta le regole e avrai la portabilità...non c'è altro modo per farlo se non infrangerle...

Altri suggerimenti

Non so come farlo su MacOS, ma sospetto che il trucco che descriverò qui possa essere portato su MacOS con un po' di lettura incrociata.

Su Linux è possibile utilizzare la cosiddetta sezione ".init_array" del binario ELF, per registrare una funzione che viene chiamata durante l'inizializzazione del programma (prima che venga chiamata main()).Questa funzione ha la stessa firma della normale funzione main(), tranne che restituisce "void".Pertanto, puoi utilizzare questa funzione per ricordare o elaborare argc, argv[] e evp[].

Ecco del codice che puoi utilizzare:

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:Questo codice può anche essere inserito in una libreria, quindi dovrebbe adattarsi al tuo caso.Funziona anche quando il tuo programma viene eseguito con valgrind - valgrind non esegue il fork di un nuovo processo e questo si traduce in /proc/self/cmdline che mostra la riga di comando originale di valgrind.

PP:Tieni presente che durante questa primissima esecuzione del programma molti sottosistemi non sono ancora completamente inizializzati - ho provato le routine I/O di libc, sembrano funzionare, ma non fare affidamento su di esse - anche le variabili gloval potrebbero non essere ancora costruite, ecc. ..

Puoi copiarli in variabili globali se lo desideri.

In Linux, puoi aprire /proc/self/cmdline (supponendo che /proc è presente) e analizzare manualmente (questo è necessario solo se è necessario argc/argv Prima main() - per esempio.in un costruttore globale - altrimenti è meglio passarli tramite variabili globali).

Altre soluzioni sono disponibili qui: http://blog.linuxgamepublishing.com/2009/10/12/argv-and-argc-and-just-how-to-get-them/

Sì, è disgustoso e intraportabile, ma se stai risolvendo problemi pratici potrebbe non interessarti.

Puoi.La maggior parte delle piattaforme fornisce variabili globali __argc e __argv.Ma ancora una volta, sostengo il commento di zneak.

PSUsa boost::program_options per analizzarli.Per favore non farlo in nessun altro modo in C++.

C'è qualche motivo per cui passare un puntatore allo spazio già consumato è così negativo?Non otterrai alcun risparmio reale eliminando l'argomento relativo alla funzione in questione e potresti innescare un interessante spettacolo pirotecnico.Aggirare lo stack di chiamate di main() con hacker creativi di solito porta a un comportamento indefinito o alla dipendenza dal comportamento specifico del compilatore.Entrambi sono dannosi rispettivamente per la funzionalità e la portabilità.

Tieni presente che gli argomenti in questione lo sono puntatori alle discussioni, consumeranno spazio, qualunque cosa tu faccia.La comodità di un loro indice è economica quanto sizeof(int), non vedo alcun motivo per non usarlo.

Sembra che tu stia ottimizzando in modo piuttosto aggressivo e prematuro, oppure sei costretto a dover aggiungere funzionalità al codice con cui davvero non vuoi scherzare.In entrambi i casi, fare le cose in modo convenzionale farà risparmiare tempo e fatica.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top