Asistentes de análisis de argumentos para C/Unix

8 minutos de lectura

avatar de usuario
efímero

Sé de lo siguiente:

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

Estoy seguro de que hay más que no he usado o de los que no he oído hablar; una búsqueda rápida en Google revela Gopto, tabla de discusióny lista de opciones.

personalmente me gusta argp mejor, y cada programa que escribí usando getopt/getopt_long (más allá de una cierta línea base de complejidad) se ha convertido para usar argp. Está más 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 que es tan flexible), y el código que lo respalda es bastante detallado (al igual que muchas cosas en C).

¿Qué usas y por qué?

Sí, me refiero a C en lugar de C++. Hay un montón de analizadores C++, pero yo no uso C++.

John Millikin señala que popt ya no se mantiene. Lo menciono porque muchos programas aún lo usan, incluidos AbiWord, rpm, rsync y samba, a pesar de los esfuerzos de Gnome por migrar lejos. Pero ahora también he agregado un enlace al analizador de argumentos de Glib.


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

avatar de usuario
dmckee — gatito ex-moderador

GNU tiene Gengetopt que genera código para una estructura de datos de opciones y el 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 beneficio adicional, puede pasar la estructura de opciones alrededor de su código y evitar el almacenamiento global si lo desea.

Proporciona semántica de estilo GNU (obviamente) y es lo suficientemente pequeño como para incluirlo simplemente con el proyecto para su distribución si no está seguro del entorno de construcción de su audiencia.

avatar de usuario
james antill

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 simplista en cualquier cosa que sí lo haga.

Por la misma razón, siempre uso optparse en las aplicaciones de Python, aunque le faltan muchas funciones en relación con getopt_long()… pero ese es el estándar de Python.

  • Nunca he usado un sistema sin glibc, pero tienes un buen punto de que getopt_long está aún más extendido. Ahora tengo curiosidad por saber por qué tanto tú como John mencionaron Python. 🙂

    – efímero

    10 de octubre de 2008 a las 19:22

  • No puedo hablar por ellos, pero en general considero que los programas C directos son una pérdida de tiempo. Escribo el programa en python y, si es necesario, las bibliotecas en C.

    – Luka Marineko

    14/10/2008 a las 22:10

  • En Python 3.x, se cambió el nombre del estándar a argparse.

    – EvertW

    12 de julio de 2018 a las 7:50

avatar de usuario
eruve

Como estaba buscando lo mismo, leí las respuestas de este viejo tema. Finalmente elegí gota que se menciona en ¿Qué bibliotecas de analizadores de parámetros existen para C++?. En realidad, está implementado en C, por lo que creo que también vale la pena mencionarlo aquí. No he usado el ayudante de C++, que envuelve la implementación de C.

Datos interesantes sobre dropt:

  • Ligero
  • Depende solo de las bibliotecas estándar
  • Sin curva de aprendizaje pronunciada
  • Suficiente para el análisis básico de argumentos, además de un par de funciones potentes
  • Fácil de extender
  • Licencia sin restricciones (zlib-ish)

Eso es Aunque limitado. Por ejemplo, tuve que adaptar un poco las especificaciones de sintaxis de mis parámetros; eso era aceptable en este mismo caso, pero, por supuesto, a veces las especificaciones están talladas en piedra.

Como conclusión, recomendaría dropt al menos para la creación rápida de prototipos, el desarrollo de herramientas y los proyectos internos.

  • Absolutamente perfecto. ¡Muchas gracias!

    –James McLaughlin

    16 de agosto de 2014 a las 18:19

  • ¡Vaya, alguien está usando mi biblioteca! =D

    – jamesdlin

    4 de diciembre de 2014 a las 10:20

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, o el puerto de Python de getopt.

avatar de usuario
sigvaldm

Tampoco me gusta demasiado 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 configuradas, así como para leer opciones con valores. Solo admite opciones cortas (p. ej., -h), aunque escribir una función similar para opciones largas (p. ej., –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 fuera breve, compatible con C, fácil de usar y sin dependencias. Aquí lo tienes:

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

  • Una desventaja de este esquema es que si el usuario escribe ./main -t -Vnunca informa sobre las opciones inválidas, simplemente las ignora (testigo -r en el ejemplo). Otra es que la función no maneja -- como ‘argumentos de fin de opción’. si alguien escribe -finput outputsu código informa que el nombre del archivo es outputno input. Estos problemas serían suficientes para evitar que use su solución. Da la casualidad de que desde argv[argc] se define como NULL, no necesita la operación de módulo. Es una idea interesante.

    –Jonathan Leffler

    19 de mayo de 2017 a las 1:01


  • Sí, es por eso que agregué el descargo de responsabilidad. Está hecho para ser mínimo en lugar de a prueba de fallas y flexible. El ejemplo usa intencionalmente -r para indicar esto. Si -finput incluso debería ser una entrada válida depende de las convenciones que utilice. Utilicé la convención de que se debe permitir la agrupación de banderas, por ejemplo -rq. Luego -finput sería una agrupación de banderas f, i, Etcétera. Por supuesto que podrías tratar el fopción diferente a q, pero entonces no sería mínimo. El módulo es necesario ya que de lo contrario la búsqueda de q evaluaría falso. Sin embargo, aprecio tus comentarios.

    – sigvaldm

    19 de mayo de 2017 a las 9:14

avatar de usuario
Pedro Mortensen

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

Mi error: dijiste C y publiqué una biblioteca de C++…

  • Una desventaja de este esquema es que si el usuario escribe ./main -t -Vnunca informa sobre las opciones inválidas, simplemente las ignora (testigo -r en el ejemplo). Otra es que la función no maneja -- como ‘argumentos de fin de opción’. si alguien escribe -finput outputsu código informa que el nombre del archivo es outputno input. Estos problemas serían suficientes para evitar que use su solución. Da la casualidad de que desde argv[argc] se define como NULL, no necesita la operación de módulo. Es una idea interesante.

    –Jonathan Leffler

    19 de mayo de 2017 a las 1:01


  • Sí, es por eso que agregué el descargo de responsabilidad. Está hecho para ser mínimo en lugar de a prueba de fallas y flexible. El ejemplo usa intencionalmente -r para indicar esto. Si -finput incluso debería ser una entrada válida depende de las convenciones que utilice. Utilicé la convención de que se debe permitir la agrupación de banderas, por ejemplo -rq. Luego -finput sería una agrupación de banderas f, i, Etcétera. Por supuesto que podrías tratar el fopción diferente a q, pero entonces no sería mínimo. El módulo es necesario ya que de lo contrario la búsqueda de q evaluaría falso. Sin embargo, aprecio tus comentarios.

    – sigvaldm

    19 de mayo de 2017 a las 9:14

avatar de usuario
Pedro Mortensen

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

  • Funcionalidad multiplataforma (Linux, OS X, 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.

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad