Помощники для анализа аргументов в C / Unix - PullRequest
37 голосов
/ 10 октября 2008

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

  • Почтенный 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 ]

15 голосов
/ 10 октября 2008

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

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

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

4 голосов
/ 16 июля 2013

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

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

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

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

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

4 голосов
/ 10 октября 2008

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

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

2 голосов
/ 18 мая 2017

Я тоже не слишком люблю 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;
}
2 голосов
/ 10 октября 2008

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

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

0 голосов
/ 20 марта 2018

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

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

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

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

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