c parsing command-line

command line arguments



Argument-parsing helpers para C/UNIX (7)

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 programa 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 programas 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 ++?


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 sintaxis 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.


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.


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 compilación de su audiencia.


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.

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 ++.


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<argc; i++){ const char *c = argv[i]; if(*c!=''-'') continue; while(*++c) if(*c==key) return argv[(i+1)%argc]; } return 0; }


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.