Помощники для анализа аргументов в 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).
- Настраиваемый парсер, в котором каждый параметр может действовать по-разному (мощная и гибкая функция).
- Автоматически генерируемые сообщения для опечаток, неизвестных параметров или недопустимых параметров.
- Дополнительные функциональные возможности для разработки пользовательского интерфейса командной строки.
- Хорошая документация.