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

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

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

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

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

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

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

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


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

Ответы

Ответ 1

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

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

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

Ответ 2

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

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

Ответ 3

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

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

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

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

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

Ответ 4

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

Я использую синтаксический анализатор glib или порт Python getopt.

Ответ 5

Я тоже не слишком люблю 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;
}

Ответ 6

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

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

Ответ 7

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

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