Argument-parsing helpers para C / UNIX

Sé de lo siguiente:

  • el getopt(3) venerable getopt(3)
  • el getopt_long extendido
  • analizador argp de glibc para vectores de argumento estilo unix
  • popt del proyecto GNOME (o su sucesor espiritual en Glib )

Estoy seguro de que hay más que no he usado o que ni siquiera he escuchado; una búsqueda rápida en Google revela Gopt , argtable y Optlist .

Personalmente, me gusta mucho argp , y cada progtwig que escribí usando getopt / getopt_long (más allá de cierta línea base de complejidad) se ha convertido para usar argp . Está más ampliamente disponible que popt , es más potente que getopt_long , está bien documentado, es coherente con todas las convenciones de estilo GNU y es muy flexible. En el lado negativo, está lejos de ser el más fácil de usar (gracias a ser tan flexible), y el código para apoyarlo es bastante detallado (como lo son muchas cosas en C).

¿Qué usas y por qué?

Editar

Sí, me refiero a C en lugar de C ++. Hay una tonelada de analizadores de C ++, pero no uso C ++.

John Millikin nota que popt ya no se mantiene. Lo enumero porque muchos progtwigs aún lo usan, incluyendo AbiWord, rpm, rsync y samba, a pesar de los esfuerzos de Gnome para migrar . Pero también he agregado un enlace al analizador de argumentos de Glib ahora.


Para el análisis sintáctico de C ++, consulte la pregunta ¿Qué bibliotecas de analizador de parámetros existen para C ++?

GNU tiene gengetopt que genera código para una estructura de datos de opciones y el código getopt_long para analizar la línea de comando y completar la estructura. Es bastante fácil de aprender y funciona bien.

Como extra, puede pasar la estructura de opciones alrededor de su código y evitar el almacenamiento global si así lo desea.

Proporciona semántica de estilo GNU (obviamente), y es lo suficientemente pequeña como para simplemente incluirla en el proyecto para su distribución si no está seguro del entorno de comstackción de su audiencia.

Como dice el refrán, “estándar es mejor que mejor”. Así que siempre uso getopt_long () y cualquier cosa que no sea gnome / glibby, y la glib uno en cualquier cosa que lo haga.

Por la misma razón, siempre uso optparse en aplicaciones python, a pesar de que tiene muchas características faltantes relativas a getopt_long () … pero esa es la std de python.

Como buscaba lo mismo, leí las respuestas de este viejo tema. Finalmente elegí dropt, que se menciona en ¿Qué biblioteca de analizadores de parámetros hay para C ++? En realidad, está implementado en C, así que creo que vale la pena mencionarlo aquí también. No he usado el ayudante de C ++, que envuelve la implementación de C.
Datos interesantes sobre dropt:

  • Ligero
  • Depende solo de las librerías estándar
  • Sin curva de aprendizaje empinada
  • Suficiente para el análisis arg básico, más un par de características poderosas
  • Fácil de extender
  • Licencia no restringida (zlib-ish)

Sin embargo, es limitado. Por ejemplo, tuve que adaptar un poco las especificaciones de syntax de mis parámetros; eso fue aceptable en este caso, pero, por supuesto, a veces las especificaciones están talladas en piedra.

Como conclusión, recomendaría menos, al menos, prototipos rápidos, desarrollo de herramientas y proyectos internos.

popt ha sido abandonado durante mucho tiempo – el análisis de argumentos se fusionó en glib desde la versión 2.6, hace tres años.

Yo uso el analizador de glib , o el puerto de getopt de Python.

Tampoco soy muy aficionado a getopt (aunque es bastante estándar). Una solución que he hecho es la función argopt (). Es compatible con C, se puede usar para probar si las banderas están establecidas y también para leer las opciones con valores. Solo admite opciones cortas (por ejemplo, -h), aunque escribir una función similar para opciones largas (por ejemplo, –help) no debería ser demasiado difícil. Ver ejemplo:

 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; } 

Ejemplo de línea de comando:

 $./main -f input.txt -rq -q is set -f is input.txt 

Descargo de responsabilidad: Hice esta función por diversión, con la intención de que sea corta, compatible con C, fácil de usar y no tenga dependencias. Aquí está:

 const char* argopt(int argc, const char *const *argv, char key){ for(int i=1; i 

Me gusta mucho la biblioteca TCLAP, porque es muy flexible y fácil de usar. También está completamente basado en plantillas, por lo que es una biblioteca solo de encabezado.

Puede encontrarlo aquí: http://tclap.sourceforge.net/

[edit] mi error me dijiste que C y yo publicamos una biblioteca en C ++.

He estado desarrollando y usando libparamset, que es una biblioteca de análisis de parámetros de línea de comandos escrita en plain C. Proporciona:

  • Funcionalidad multiplataforma (Linux, OSX, Windows).
  • Analizador configurable donde cada parámetro puede actuar de manera diferente (función potente y flexible).
  • Mensajes generados automáticamente para errores tipográficos, parámetros desconocidos o parámetros no válidos.
  • Funcionalidad adicional para diseñar la interfaz de usuario de línea de comandos.
  • Buena documentación.