Christian Seiler: / C++: commandline parsing

Beitrag lesen

Hallo,

Anmerkung: Mir ist es bewusst, dass es einen Haufen an Libraries gibt, etwa boost::program_options oder anyoption. Auch wenn Boost quasi-Standard ist, wäre das in meinem Fall eher Overkill.

Naja, C-basiert gibt's noch POPT als Library, das funktioniert anscheinend auch unter Windows (das aber nie getestet), allerdings glaube ich nicht, dass Du hier jemanden finden wirst, der Dir hilft, Deine eigene Lib zu schreiben, nur, weil Du keine Lust hast, etwas vorgefertigtes zu nehmen. Es gibt da einfach zu viele Möglichkeiten, vorhandenen Code zu nutzen, als dass sich die wenigen Leute hier im Forum, die sich mit C auskennen, jemals Gedanken gemacht hätten, sowas selbst zu bauen.

Naja, ansonsten zum Thema Datenstrukturdesign, da Du offensichtlich C++ verwendest, würde ich in etwa folgendes machen (schnell zusammengehackt, kann man sicher besser machen):

struct option {  
  char short;  // 0, wenn keine kurze option verfügbar  
  string long; // leer, wenn keine lange option verfügbar  
  int takesarg; // ob man zu dieser option ein argument mitgeben muss  
  int optional; // ob die option angegeben werden muss  
};  
  
struct parsed_option {  
  char short;  // kopiert aus der jew. struct option  
  string long; // kopiert aus der jew. struct option  
  int hadarg;  // ob die option ein argument hatte  
  string arg;  // der inhalt des arguments  
};  
  
class OptionParser {  
  // Wie private/protected aussieht sei Dir überlassen  
  public:  
    // Konstruktor: Initialisiere den Option-Parser  
    // (kannst gerne auch was anderes als vector nehmen)  
    OptionParser (vector<option> options);  
    // Parse Argumente, gibt an ob alles korrekt war  
    bool parse (int argc, char **argv);  
    // Gib die angegebenen optionen zurück  
    vector <parsed_option> getOptions ();  
    // Gib die verbleibenden Argumente zurück  
    vector <string> getArguments ();  
}

Kann man wie gesagt sicher noch stark verbessern oder beliebig verkomplizieren. Ich verstehe aber nicht, warum Du Dich nicht auf bereits geschriebenen, gut getesteten Code verlassen willst und stattdessen so etwas nachprogrammieren willst...

Viele Grüße,
Christian