Помощники для анализа аргументов в 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++...