command line arguments
Argument-parsing helpers para C/UNIX (7)
Sé de lo siguiente:
- el
getopt(3)
venerablegetopt(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.