2012-10-12 13 views
5

Se voglio mantenere la maggior parte del mio codice per l'elaborazione degli argomenti della riga di comando dal main (per l'organizzazione e il codice più leggibile), quale sarebbe il modo migliore per farlo?Process argc e argv outside main()

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

risposta

4

O li passano come parametri, o memorizzarli in variabili globali. Finché non si torna da main e si tenta di elaborarli in un gestore atexit o nel distruttore di un oggetto nell'ambito globale, esistono ancora e andranno bene per accedere da qualsiasi ambito.

Ad esempio:

// Passing them as args: 
void process_command_line(int argc, char **argv) 
{ 
    // Use argc and argv 
    ... 
} 

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

alternativa:

// 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(); 
    ... 
} 

passandoli come parametri è un design migliore, dal momento che è incapsulato e ti permette di modificare i parametri/sostitutivi se si desidera o convertire facilmente il vostro programma in una biblioteca. Le variabili globali sono più semplici, poiché se si dispone di molte funzioni diverse che accedono agli argomenti per qualsiasi motivo, è possibile archiviarle una sola volta e non è necessario continuare a passarle tra tutte le diverse funzioni.

2

semplicemente passare argc e argv come argomenti della funzione in cui si desidera elaborare loro.

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

3

Uno dovrebbe rispettare gli standard ovunque sia pratico. Così, non scrivere

void main 

che non è mai stato valido C o C++, ma invece scrivere

int main 

Con questo, il codice può essere compilato con per esempio g ++ (con le normali opzioni del compilatore).

Dato il void main, ho il sospetto che un ambiente Windows. E comunque, per supportare l'uso del tuo programma in ambiente Windows, non dovresti usare gli argomenti main in Windows. Funzionano in * nix perché sono stati progettati in e per quell'ambiente; non funzionano in generale in Windows, perché per impostazione predefinita (con convenzione molto forte) sono codificati come ANSI di Windows, il che significa che non possono codificare i nomi di file con caratteri esterni alle impostazioni locali dell'utente.

Quindi per Windows è meglio utilizzare la funzione GetCommandLine API e la sua funzione di analisi sorella. Per la portabilità questo dovrebbe essere meglio incapsulato in alcuni moduli della riga di comando. Quindi è necessario affrontare il problema interessante dell'utilizzo di wchar_t in Windows e char in * nix & hellip;

In ogni caso, non sono sicuro dell'API * nix corrispondente, o anche se ce n'è uno, ma lo google. Nel peggiore dei casi, per * nix puoi sempre inizializzare un modulo per gli argomenti della riga di comando da main. La bruttezza di * nix deriva direttamente dalla necessità di supportare la portabilità con il costrutto più specifico del SO, non specifico del C++, cioè lo standard main.

+0

Sono pienamente d'accordo con 'int main' su' void main'. Tuttavia, l'altro commento mi lascia ... confuso. Quale sistema diverso da Windows ha un problema con la convenzione C++ standard per 'main()'? Non ne sono a conoscenza, quindi il castigating della convenzione standard come 'non-portatile' e 'OS-specifico' sembra OTT. –

+0

@JonathanLeffler: Non sono a conoscenza di alcun sistema comunemente utilizzato diverso da Windows in cui gli argomenti 'main' non funzionano (tranne che per il testo ASCII puro dell'alfabeto inglese). Tuttavia, una funzionalità che non funziona in Windows ** è ** non portabile, e una funzionalità progettata per Unix-land ** è ** specifica per il sistema operativo. E la convenzione degli argomenti 'main' non funziona in Windows (cioè non è portabile), ed è progettata per Unix-land (cioè specifico per OS), e questi due aspetti sono fortemente connessi. Non c'è assolutamente nulla di divertente in questo. Posso solo pensare a brutte ragioni politiche per la sua persistenza. –

0

Controllare la famiglia di funzioni e librerie "getoptlong". Questi offrono un modo strutturato di definire gli argomenti che il tuo programma si aspetta e possono quindi analizzarli prontamente per te.Può anche aiutare con la generazione di documentazione/risposte di aiuto.

È una vecchia libreria nel mondo UNIX e anche un'implementazione .Net in C#. (+ Perl, Ruby, & probabilmente di più. È bello avere un unico paradigma utilizzabile su tutti questi! Impara una volta, usa ovunque!)