2009-03-12 16 views
12

Eventuali duplicati:
What parameter parser libraries are there for C++?Parser di opzioni per C/C++?

Ho fatto qualche ricerca e ci sono un sacco di librerie per l'opzione della linea di comando, ma è difficile distinguere tra di loro. Qualcuno ha qualche esperienza con qualcuno di loro? È uno più difficile/migliore/più veloce/più facile/qualunque rispetto a tutti gli altri? O dovrei semplicemente coltivare il mio?

+3

Esegui il mio voto per "tira il tuo". a) Si impara da esso, b) è divertente, e c) non dovrai preoccuparti della portabilità o del codice di qualcun altro, e d) sai che avrai tutte le funzionalità che desideri e nessuna delle quelli che non conosci Tuttavia, penso che sarò in minoranza. –

+9

@Chris Lutz: a meno che tu non faccia il tuo, quindi aderisca molto strettamente allo standard, allora rischi di produrre programmi che sono irritanti da usare. L'utilizzo di un parser di opzioni standard riduce l'apprendimento per tutti gli altri (che utilizzano il tuo programma) e, di solito, semplifica anche la manutenzione. –

+2

Recentemente ho lanciato https://github.com/visionmedia/commander.ca port-ish del mio parsy e del parser dell'opzione node –

risposta

1

se si utilizza linux/unix quindi getopt è l'opzione parser per voi. funziona su quasi tutti i gusti di Unix ed è facile da usare

13

Per molti scopi, le funzioni GNU getopt() e getopt_long() sono buone scelte.

GNU getopt() è per argomenti di opzioni a singola lettera e si avvicina abbastanza al comportamento standard POSIX e può essere persuaso a comportarsi in modo più ortodosso impostando la variabile di ambiente POSIXLY_CORRECT. La differenza è che GNU getopt() riconosce gli argomenti delle opzioni dopo il primo argomento non-option e permuta gli argomenti in modo che tutti gli argomenti dell'opzione vengano elaborati prima di qualsiasi argomento non-option. Questo a volte conta, anche se i contesti tendono ad essere un po 'esoterici. Ci sono alcuni altri trucchi extra disponibili.

GNU getopt_long() è il miglior meccanismo per gestire opzioni lunghe come --help. È in grado di gestire argomenti opzionali, abbinando opzioni a lettera singola e ogni sorta di cose.

Sono disponibili numerosi altri pacchetti che gestiscono le opzioni in vari modi.

(Perl ha una pletora di moduli getopt, che riflette quanto impegno è stato messo in nel corso degli anni.)

Potreste trovare alcune utili informazioni in più a What is the general syntax of a Unix shell command. È inoltre possibile leggere le specifiche POSIX per le convenzioni della riga di comando nel capitolo Utility Conventions.

+0

C'è solo una cosa negativa di GNU getopt() ed è la licenza. – Anonymous

+1

Sì - è almeno LGPL in questi giorni. Era GPL completo. Puoi ottenere versioni non GNU di getopt(). Ad esempio, AT & T ha pubblicato la fonte su UseNet. –

+2

Una buona specifica di come le utilità POSIX sono progettate per funzionare è fornita nel capitolo POSIX [Utility Conventions] (http://www.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap12.html). –

18

Se si desidera qualcosa di completamente multipiattaforma, ho trovato la libreria Boost::Program_Options molto buona. C'è qualcosa di una curva di apprendimento per configurarlo, ma una volta imparato, semplifica notevolmente le cose.

+0

La cosa brutta di questa libreria è che non è un "solo header", al contrario della maggior parte degli altri componenti di Boost. Non ho mai veramente capito perché questo è il caso. – becko

+0

Solo perché lo sviluppatore ha scelto di farlo in quel modo. Sono diventato meno innamorato di esso da quando ho scritto anche quello. È buono e multipiattaforma, ma trovo che preferisco le opzioni di gestione con il mio codice per la maggior parte del tempo. Il tempo necessario per scrivere da zero un parser di opzioni è spesso inferiore a quello che mi costerebbe capire come impostare il codice della libreria per fare la stessa cosa, soprattutto perché non ho bisogno di gestire i file di configurazione, solo le opzioni della riga di comando. –

+1

Il fatto che Boost :: Program_Options non sia solo intestazione è un problema, perché Boost aggiorna frequentemente la versione. Ciò significa che se non si collega staticamente a Boost :: Program_Options, il programma non verrà eseguito su tutte le macchine con la versione errata di Boost! – becko

1

Io uso l'implementazione di sistema di getopt_long() per la maggior parte delle cose, tuttavia potrebbe essere necessario essere più portabili che proibisce l'uso di tali comodità di creatura POSIX.

Here is the standard per quanto riguarda la vista POSIX delle opzioni della riga di comando se ci si trova in una posizione in cui getopt()/getopt_long() non sono disponibili e devono essere personalizzati. Potresti anche dare un'occhiata a ciò che POSIX ha da dire su display di aiuto/riepilogo delle opzioni (non riesco a trovare un link a quella parte dello standard a portata di mano).

Personalmente, non mi piace usare programmi che non prendono --long-opzioni, perché ricordare le opzioni brevi è un dolore e non ci sono due programmi che usano lo stesso.

6

boost::program_optionsboost::program_options è piuttosto buono e ha una bella interfaccia C++ che può verificare che i parametri di opzione abbiano un determinato tipo (come 'int') e li memorizzino direttamente in variabili.

Supporta anche caricare le "opzioni" da un file di configurazione, in modo da ottenere un parser di file di configurazione gratuito. In questo modo puoi facilmente consentire di sovrascrivere tutte le impostazioni di configurazione dalla riga di comando o aggiungere tutte le opzioni della riga di comando al file di configurazione, il che lo rende molto flessibile.

2

inoltre ci sono popt.