Помощники для анализа аргументов в C/Unix

Я знаю следующее:

  • Почтенный getopt(3)
  • Расширенный getopt_long
  • Glibc-х argp парсер для векторов аргументов в стиле Unix
  • popt из проекта GNOME (или его духовного наследника в Glib)

Я уверен, что есть еще кое-что, что я не использовал или даже не слышал; быстрый поиск в Google показывает Gopt, argtable и Optlist.

Лично мне нравится argp лучше всего, и каждая программа, которую я написал, используя getopt / getopt_long (за пределами определенного базового уровня сложности) был преобразован для использования argp, Это более широко доступно, чем popt более мощный, чем getopt_long, хорошо документированный, совместимый со всеми соглашениями в стиле GNU, и очень гибкий. С другой стороны, его далеко не так просто использовать (благодаря его гибкости), а код для его поддержки довольно многословен (как и многие другие вещи в C).

Что вы используете и почему?

Да, я имею в виду C, а не C++. Существует множество синтаксических анализаторов C++, но я не использую C++.

Джон Милликин отмечает, что popt больше не поддерживается. Я перечисляю это, потому что многие программы все еще используют это - включая AbiWord, rpm, rsync и samba - несмотря на усилия Gnome по миграции. Но теперь я добавил ссылку на парсер аргументов Глиба.


Для разбора аргументов C++ см. Вопрос Какие библиотеки синтаксического анализатора параметров существуют для C++?

7 ответов

Решение

GNU имеет gengetopt, который генерирует код для структуры данных опций и getopt_long код для разбора командной строки и заполнения структуры. Его довольно легко выучить и он хорошо работает.

В качестве бонуса вы можете передать структуру параметров вокруг вашего кода и избежать глобального хранения при желании.

Он обеспечивает семантику стиля GNU (очевидно) и достаточно мал, чтобы просто включить его в проект для распространения, если вы не уверены в среде сборки своей аудитории.

Как говорится, "стандарт лучше, чем лучше". Поэтому я всегда использую getopt_long() и все, что не является GNOME/glibby, и glib для всего, что делает.

По той же причине я всегда использую optparse в приложениях Python, даже несмотря на то, что в нем много отсутствующих функций относительно getopt_long() ... но это стандарт Python.

Так как я искал то же самое, я прочитал ответы на эту старую тему. Наконец, я выбрал dropt, который упоминается в разделе Какие библиотеки анализатора параметров существуют для C++?, На самом деле это реализовано на C, поэтому я думаю, что стоит упомянуть и здесь. Я не использовал помощник C++, который оборачивает реализацию C.

Интересные факты о дропе:

  • облегченный
  • Зависит только от стандартных библиотек
  • Нет крутой кривой обучения
  • Достаточно для базового разбора аргументов, плюс пара мощных функций
  • Легко продлить
  • Неограниченная лицензия (zlib-ish)

Это ограничено, хотя. Например, мне пришлось немного адаптировать спецификации синтаксиса моих параметров; это было приемлемо в этом самом случае, но, конечно, иногда спецификации высечены в камне.

В заключение я бы порекомендовал dropt хотя бы для быстрого создания прототипов, разработки инструментов и внутренних проектов.

popt давно заброшен - разбор аргументов был объединен в glib начиная с версии 2.6 три года назад.

я использую glib парсер, или порт Python getopt,

Я тоже не слишком люблю getopt (хотя он довольно стандартный). Одним из решений, которое я сделал, является функция argopt(). Он совместим с C, может использоваться для проверки, установлены ли флаги, а также для чтения параметров со значениями. Он поддерживает только короткие опции (например, -h), хотя написание аналогичной функции для длинных опций (например, --help) не должно быть слишком сложным. Смотрите пример:

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

Пример из командной строки:

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

Отказ от ответственности: я сделал эту функцию для удовольствия, намереваясь сделать ее короткой, C-совместимой, простой в использовании и не имеющей зависимостей. Вот:

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

Я разрабатывал и использовал libparamset, который является библиотекой синтаксического анализа параметров командной строки, написанной на простом C. Она обеспечивает:

  • Кроссплатформенная функциональность (Linux, OS X, Windows).
  • Конфигурируемый парсер, в котором каждый параметр может действовать по-разному (мощная и гибкая функция).
  • Автоматически генерируемые сообщения для опечаток, неизвестных параметров или недопустимых параметров.
  • Дополнительная функциональность для разработки пользовательского интерфейса командной строки.
  • Хорошая документация.

Мне очень нравится библиотека TCLAP, потому что она очень гибкая и простая в использовании. Он также полностью основан на шаблонах, поэтому это библиотека только для заголовков.

Моя ошибка: вы сказали C, а я разместил библиотеку C++...

Другие вопросы по тегам