Pregunta Argument-parsing helpers para C / UNIX


Sé de lo siguiente:

  • el venerable getopt(3)
  • el extendido getopt_long
  • glibc's argp analizador para vectores de argumento de estilo Unix
  • popt del proyecto GNOME (o su sucesor espiritual en Fácil)

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

Personalmente, me gusta argp mejor, y cada programa que escribí usando getopt/getopt_long (más allá de cierta línea de base de complejidad) se ha convertido para usar argp. Está más ampliamente disponible que poptmás poderoso que getopt_long, bien documentado, consistente con todas las convenciones de estilo GNU, y 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 señala que popt ya no se mantiene. Lo enumero porque muchos programas todavía lo usan, incluyendo AbiWord, rpm, rsync y samba, a pesar de los esfuerzos de Gnome para emigrar lejos. Pero también he agregado un enlace al analizador de argumentos de Glib ahora.


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


32
2017-10-10 02:51


origen


Respuestas:


GNU tiene gengetopt que genera código para una estructura de datos de opciones y getopt_long código 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.


14
2017-10-10 15:17



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.


4
2017-10-10 19:05



Como buscaba lo mismo, leí las respuestas de este viejo tema. Finalmente elegí dropt que se menciona en ¿Qué bibliotecas de analizador de parámetros existen 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.


4
2017-07-16 07:56



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

yo suelo glibanalizador de Python, o el puerto de Python getopt.


2
2017-10-10 02:55



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

1
2018-05-18 18:31



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.

Lo puedes encontrar aquí: http://tclap.sourceforge.net/ 

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


0
2017-10-10 02:55



He estado desarrollando y usando libparamset esa es la biblioteca de análisis de parámetros de línea de comandos escrita en el plano 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.

0
2018-03-20 11:30