Hilfsprogramme zur Analyse von Argumenten für C/Unix

Lesezeit: 7 Minuten

Benutzeravatar von ephemient
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 --- Benutzeravatar des Ex-Moderators Kitten
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.

Benutzeravatar von James Antill
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

Benutzeravatar von eruve
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.

Benutzeravatar von sigvaldm
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:

const char* argopt(int argc, const char *const *argv, char key){

    for(int i=1; i<argc; i++){
        const char *c = argv[i];
        if(*c!='-') continue;
        while(*++c) if(*c==key) return argv[(i+1)%argc];
    }

    return 0;
}

  • 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

Benutzeravatar von Peter Mortensen
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

Benutzeravatar von Peter Mortensen
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 …

1398370cookie-checkHilfsprogramme zur Analyse von Argumenten für C/Unix

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy