Hilfsprogramme zur Analyse von Argumenten für C/Unix
Lesezeit: 7 Minuten
vergänglich
Mir ist folgendes bekannt:
Der Ehrwürdige getopt(3)
Das erweiterte getopt_long
glibcs argp Parser für Argumentvektoren im Unix-Stil
Popt aus dem GNOME-Projekt (oder seinem spirituellen Nachfolger in Glib)
Ich bin mir sicher, dass es noch mehr gibt, die ich noch nicht benutzt oder gar gehört habe; eine schnelle Google-Suche verrät Gopt, streitbarund Auswahlliste.
Mir persönlich gefällt es argp am besten und jedes Programm, mit dem ich geschrieben habe getopt/getopt_long (jenseits einer bestimmten Komplexitätsbasis) wurde in die Verwendung umgewandelt argp. Es ist weiter verbreitet als poptmächtiger als getopt_long, gut dokumentiert, mit allen Konventionen im GNU-Stil vereinbar und sehr flexibel. Auf der anderen Seite ist es alles andere als am einfachsten zu verwenden (dank seiner Flexibilität), und der Code, der es unterstützt, ist ziemlich ausführlich (wie viele Dinge in C).
Was verwendest du und warum?
Ja, ich meine eher C als C++. Es gibt eine Menge C++-Parser, aber ich verwende kein C++.
John Millikin stellt das fest popt wird nicht mehr gepflegt. Ich führe es auf, weil viele Programme es immer noch verwenden – einschließlich AbiWord, rpm, rsync und samba – trotz der Bemühungen von Gnome, dies zu tun weg migrieren. Aber ich habe jetzt auch einen Link zu Glibs Argument-Parser hinzugefügt.
Informationen zum Analysieren von C++-Argumenten finden Sie in der Frage Welche Parameter-Parser-Bibliotheken gibt es für C++?
dmckee — Ex-Moderator-Kätzchen
GNU hat gengetopt die Code für eine Optionsdatenstruktur generiert und die getopt_long Code, um die Befehlszeile zu analysieren und die Struktur zu füllen. Es ist ziemlich einfach zu lernen und funktioniert gut.
Als Bonus können Sie die Optionsstruktur um Ihren Code herumgeben und auf Wunsch die globale Speicherung vermeiden.
Es bietet (offensichtlich) eine Semantik im GNU-Stil und ist klein genug, um es einfach in das Projekt zur Verteilung aufzunehmen, wenn Sie sich über die Build-Umgebung Ihres Publikums nicht sicher sind.
Jakob Antill
Wie das Sprichwort sagt, “Standard ist besser als besser”. Also verwende ich immer getopt_long() und alles, was nicht GNOME/glibby ist, und das glib-Element für alles, was dies tut.
Aus dem gleichen Grund verwende ich optparse immer in Python-Anwendungen, obwohl es im Vergleich zu getopt_long() viele fehlende Funktionen hat … aber das ist der Python-Standard.
Ich habe noch nie ein System ohne glibc verwendet, aber Sie haben einen guten Punkt, dass getopt_long noch weiter verbreitet ist. Jetzt bin ich neugierig, warum Sie und John Python erwähnt haben? 🙂
– vergänglich
10. Oktober 2008 um 19:22 Uhr
Ich kann nicht für sie sprechen, aber im Allgemeinen denke ich, dass es Zeit ist, direkte C-Programme zu schreiben. Ich schreibe Programme in Python und ggf. Bibliotheken in C.
– Lukas Marinko
14. Oktober 2008 um 22:10 Uhr
In Python 3.x wurde der Standard in argparse umbenannt.
– EvertW
12. Juli 2018 um 7:50 Uhr
Eruve
Da ich dasselbe gesucht habe, habe ich die Antworten zu diesem alten Thema gelesen. Schließlich habe ich gewählt dropt was darin erwähnt wird Welche Parameter-Parser-Bibliotheken gibt es für C++?. Eigentlich ist es in C implementiert, also denke ich, dass es auch hier erwähnenswert ist. Ich habe den C++-Helfer nicht verwendet, der die C-Implementierung umschließt.
Wissenswertes über dropt:
Leicht
Hängt nur von Standardbibliotheken ab
Keine steile Lernkurve
Ausreichend für grundlegendes arg-Parsing plus ein paar leistungsstarke Funktionen
Einfach zu verlängern
Uneingeschränkte Lizenz (zlib-ish)
Es ist allerdings begrenzt. Zum Beispiel musste ich meine Parameter-Syntax-Spezifikationen ein wenig anpassen; Das war in diesem Fall akzeptabel, aber natürlich sind manchmal Spezifikationen in Stein gemeißelt.
Als Fazit würde ich dropt zumindest für schnelles Prototyping, Toolentwicklung und Inhouse-Projekte empfehlen.
Absolut perfekt. Vielen Dank!
– James McLaughlin
16. August 2014 um 18:19 Uhr
popt wurde für a aufgegeben lang time — Argumentanalyse wurde zusammengeführt glib seit Version 2.6, vor drei Jahren.
ich benutze glib‘s Parser oder Pythons Port von getopt.
sigvaldm
Ich mag getopt auch nicht besonders (obwohl es ziemlich Standard ist). Eine Lösung, die ich gemacht habe, ist die Funktion argopt(). Es ist C-kompatibel, kann verwendet werden, um zu testen, ob Flags gesetzt sind, sowie um Optionen mit Werten zu lesen. Es unterstützt nur kurze Optionen (z. B. -h), obwohl das Schreiben einer ähnlichen Funktion für lange Optionen (z. B. –help) nicht allzu schwierig sein sollte. Siehe Beispiel:
int main(int argc, char **argv){
if(argopt(argc, argv, 'p')) printf("-p is set\n");
if(argopt(argc, argv, 'q')) printf("-q is set\n");
const char *f = argopt(argc, argv, 'f');
if(f) printf("-f is %s\n",f);
return 0;
}
Beispiel aus der Kommandozeile:
$./main -f input.txt -rq
-q is set
-f is input.txt
Haftungsausschluss: Ich habe diese Funktion zum Spaß erstellt, mit der Absicht, dass sie kurz, C-kompatibel, einfach zu verwenden ist und keine Abhängigkeiten hat. Hier ist es:
Ein Nachteil dieses Schemas besteht darin, dass, wenn der Benutzer tippt ./main -t -Vberichten Sie nie über die ungültigen Optionen – Sie ignorieren sie einfach (Zeugnis -r im Beispiel). Ein weiterer Grund ist, dass die Funktion nicht funktioniert -- als ‘Ende der Optionsargumente’. Wenn jemand schreibt -finput outputmeldet Ihr Code, dass der Dateiname lautet outputnicht input. Diese Probleme würden ausreichen, um mich davon abzuhalten, Ihre Lösung zu verwenden. Wie es sich gehört, seit argv[argc] als NULL definiert ist, brauchen Sie die Modulo-Operation nicht. Es ist eine interessante Idee.
– Jonathan Leffler
19. Mai 2017 um 1:01 Uhr
Ja, deshalb habe ich den Haftungsausschluss hinzugefügt. Es ist eher minimal als ausfallsicher und flexibel. Das Beispiel verwendet absichtlich -r um dies anzuzeigen. Ob -finput überhaupt eine gültige Eingabe sein soll, hängt davon ab, welche Konventionen Sie verwenden. Ich habe die Konvention verwendet, dass das Gruppieren von Flags erlaubt sein sollte, z -rq. Dann -finput wäre eine Gruppierung von Flags f, i, und so weiter. Natürlich könnte man das behandeln fOption anders als q, aber dann wäre es nicht minimal. Der Modulus ist notwendig, da sonst die Suche nach q falsch auswerten würde. Ich freue mich aber über dein Feedback.
– sigvaldm
19. Mai 2017 um 9:14 Uhr
Peter Mortensen
Ich habe entwickelt und verwendet libparamset Das ist eine Befehlszeilenparameter-Parsing-Bibliothek, die in einfachem C geschrieben ist. Sie bietet:
Plattformübergreifende Funktionalität (Linux, OS X, Windows).
Konfigurierbarer Parser, bei dem sich jeder Parameter anders verhalten kann (leistungsstarke und flexible Funktion).
Automatisch generierte Nachrichten für Tippfehler, unbekannte Parameter oder ungültige Parameter.
Zusätzliche Funktionalität zum Entwerfen einer Befehlszeilen-Benutzeroberfläche.
Gute Dokumentation.
Ein Nachteil dieses Schemas besteht darin, dass, wenn der Benutzer tippt ./main -t -Vberichten Sie nie über die ungültigen Optionen – Sie ignorieren sie einfach (Zeugnis -r im Beispiel). Ein weiterer Grund ist, dass die Funktion nicht funktioniert -- als ‘Ende der Optionsargumente’. Wenn jemand schreibt -finput outputmeldet Ihr Code, dass der Dateiname lautet outputnicht input. Diese Probleme würden ausreichen, um mich davon abzuhalten, Ihre Lösung zu verwenden. Wie es sich gehört, seit argv[argc] als NULL definiert ist, brauchen Sie die Modulo-Operation nicht. Es ist eine interessante Idee.
– Jonathan Leffler
19. Mai 2017 um 1:01 Uhr
Ja, deshalb habe ich den Haftungsausschluss hinzugefügt. Es ist eher minimal als ausfallsicher und flexibel. Das Beispiel verwendet absichtlich -r um dies anzuzeigen. Ob -finput überhaupt eine gültige Eingabe sein soll, hängt davon ab, welche Konventionen Sie verwenden. Ich habe die Konvention verwendet, dass das Gruppieren von Flags erlaubt sein sollte, z -rq. Dann -finput wäre eine Gruppierung von Flags f, i, und so weiter. Natürlich könnte man das behandeln fOption anders als q, aber dann wäre es nicht minimal. Der Modulus ist notwendig, da sonst die Suche nach q falsch auswerten würde. Ich freue mich aber über dein Feedback.
– sigvaldm
19. Mai 2017 um 9:14 Uhr
Peter Mortensen
Ich mag die TCLAP Bibliothek, weil sie sehr flexibel und einfach zu bedienen ist. Es ist auch vollständig vorlagenbasiert, also eine Header-only-Bibliothek.
Mein Fehler: Sie sagten C und ich habe eine C ++ – Bibliothek gepostet …
13983700cookie-checkHilfsprogramme zur Analyse von Argumenten für C/Unixyes