getopt.h: Comstackr le code C Linux sous Windows

J’essaie de comstackr un ensemble de neuf fichiers * .c (et neuf fichiers * .h associés) sous Windows.

Le code a été initialement conçu sous Linux pour prendre les arguments de ligne de commande en utilisant la bibliothèque standard GNU-Linux / C “getopt.h”. Et cette bibliothèque ne s’applique pas à la construction du code C dans Windows.

Je veux ignorer ce que mon code fait actuellement et poser la question suivante. Pour ceux d’entre vous qui connaissent bien cette bibliothèque C “getopt.h”: sera-t-il possible de créer et d’exécuter mon code sous Windows s’il dépend d’arguments de ligne de commande de style POSIX? Ou devrais-je réécrire le code pour travailler sous Windows, en passant les fichiers d’entrée différemment (et en abandonnant la dépendance “getopt.h”)?

Vous avez raison. getopt() est POSIX, pas Windows, vous devriez généralement réécrire tout le code d’parsing des arguments en ligne de commande.

Heureusement, il existe un projet, Xgetopt, destiné aux classes Windows / MFC.

http://www.codeproject.com/Articles/1940/XGetopt-A-Unix-compatible-get -for-MFC-and-Win32

Si vous parvenez à ce que cela fonctionne dans votre projet, cela vous épargnera pas mal de codage et vous évitera d’avoir à retravailler toute l’parsing.

En outre, il est livré avec une application de démonstration agréable dotée d’une interface graphique que vous devriez trouver utile.

Bonne chance!

getopt() est en fait une fonction très simple. J’ai fait un github gist pour cela, le code d’ici est aussi en dessous

 #include  #include  int opterr = 1, /* if error message should be printed */ optind = 1, /* index into parent argv vector */ optopt, /* character checked for validity */ optreset; /* reset getopt */ char *optarg; /* argument associated with option */ #define BADCH (int)'?' #define BADARG (int)':' #define EMSG "" /* * getopt -- * Parse argc/argv argument vector. */ int getopt(int nargc, char * const nargv[], const char *ostr) { static char *place = EMSG; /* option letter processing */ const char *oli; /* option letter list index */ if (optreset || !*place) { /* update scanning pointer */ optreset = 0; if (optind >= nargc || *(place = nargv[optind]) != '-') { place = EMSG; return (-1); } if (place[1] && *++place == '-') { /* found "--" */ ++optind; place = EMSG; return (-1); } } /* option letter okay? */ if ((optopt = (int)*place++) == (int)':' || !(oli = strchr(ostr, optopt))) { /* * if the user didn't specify '-' as an option, * assume it means -1. */ if (optopt == (int)'-') return (-1); if (!*place) ++optind; if (opterr && *ostr != ':') (void)printf("illegal option -- %c\n", optopt); return (BADCH); } if (*++oli != ':') { /* don't need argument */ optarg = NULL; if (!*place) ++optind; } else { /* need an argument */ if (*place) /* no white space */ optarg = place; else if (nargc <= ++optind) { /* no arg */ place = EMSG; if (*ostr == ':') return (BADARG); if (opterr) (void)printf("option requires an argument -- %c\n", optopt); return (BADCH); } else /* white space */ optarg = nargv[optind]; place = EMSG; ++optind; } return (optopt); /* dump back option letter */ } 

J’ai compilé le code getopt sous Windows.

Je l’ai fait car je voulais expliquer l’ utilisation de sa fonctionnalité d’parsing en ligne de commande dans une application Windows (ligne de commande).

J’ai réussi à utiliser VC2010 .

Autant que je me souvienne, je n’ai rencontré aucun problème important.

getopt.c getoptl.c

Il y a une possibilité d’utiliser le code du runtime MinGW (par Todd C. Miller):

http://sourceforge.net/apps/trac/mingw-w64/browser/trunk/mingw-w64-crt/misc

J’ai créé une petite bibliothèque avec ces fichiers et le script CMake (pouvant générer un projet VS):

https://github.com/alex85k/wingetopt

Vous pourriez essayer de regarder glib-2.0 comme alternative. Ce serait un peu gros pour avoir simplement besoin d’un parsingur d’options. Le bon côté serait d’avoir access à tous les autres jouets merveilleux dans la glib.

Pour être honnête, je n’ai pas essayé de faire en sorte que cela fonctionne (je m’en tiens principalement à Linux), donc YMMV.

Faire fonctionner la glib sous Windows: HowTo

Oh, vous pourriez explorer l’utilisation de mingw pour l’environnement de compilation et de Visual Studio pour votre IDE.

Glib pour Win32: HowTo

Quoi qu’il en soit, espérons que cela aide.

si vous voulez juste que getopt soit utilisé dans Visual C ++ sans autres dépendances, j’ai le port getopt.c de la dernière version de GNU Libc 2.12, avec toutes les nouvelles fonctionnalités. La seule différence est que vous devez utiliser TCHAR au lieu de char, mais c’est très commun dans les fenêtres.

Il suffit de télécharger le code source, créer, copier libgetopt.lib et getopt.h getopt_int.h dans votre projet.

vous pouvez aussi le créer en utilisant CMakeList.txt dans le répertoire racine.

télécharger le source depuis github

Le getopt.h existe dans git, je l’ai téléchargé et cela fonctionne pour moi:

https://gist.github.com/ashelly/7776712

De ce que je me souviens de getopt.h , tout ce qu’il fait est de fournir un parsingur syntaxique pratique pour traiter les arguments de votre fonction principale:

 int main(int argc, char * argv[]) { } 

Les programmes de la console Windows ont toujours une méthode principale, vous pouvez donc simplement parcourir votre tableau argv et parsingr les parameters vous-même. par exemple

 for ( int i = 1; i < argc; i++ ) { if (!strcmp(argv[i], "-f")) filename = argv[++i]; }