2009-03-12 3 views
12

Можно создать дубликат:
What parameter parser libraries are there for C++?Опция Parsers для C/C++?

Я сделал некоторые глядя, и есть много библиотек для командной строки вариант разбора, но трудно провести различие между ними. Кто-нибудь имеет какой-либо опыт с любым из них? Является ли один труднее/лучше/быстрее/проще/независимо от любого другого? Или я должен просто вырастить свой собственный?

+3

Отдать свой голос за «бросьте свое». a) Вы учитесь на этом, b) это весело, и c) вам не придется беспокоиться о переносимости или в зависимости от чужого кода, и d) вы знаете, что у вас будут все функции, которые вы хотите, и ни один из у вас нет. Однако, я думаю, я буду в меньшинстве. –

+9

@ Крис Лутц: если вы не катитесь самостоятельно, чтобы он придерживался очень близко к стандарту, тогда вам грозит производство программ, которые раздражают использование. Использование стандартного парсера параметров уменьшает обучение для всех остальных (кто использует вашу программу) и обычно упрощает обслуживание. –

+2

Недавно я выкатил https://github.com/visionmedia/commander.ca порт-иш моего анализатора параметров ruby ​​и node –

ответ

1

Если вы используете linux/unix, то getopt - это парсер параметров для вас. работает практически со всеми вкусами unix и прост в использовании.

13

Для многих целей функции GNU getopt()10 и getopt_long() являются хорошим выбором.

GNU getopt() предназначен для аргументов с одной буквой и имеет довольно близкие к стандарту поведения POSIX, и их можно убедить вести себя более ортодоксально, установив переменную окружения POSIXLY_CORRECT. Разница в том, что GNU getopt() распознает аргументы параметров после первого аргумента без аргумента и переставляет аргументы таким образом, чтобы все аргументы параметров обрабатывались до любого из аргументов без параметра. Это иногда имеет значение - хотя контексты, как правило, немного эзотеричны. Есть еще несколько дополнительных трюков.

GNU getopt_long() - лучший механизм для работы с длинными опциями, такими как --help. Он может обрабатывать необязательные аргументы, сопоставляя однобуквенные параметры и всевозможные вещи.

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

(Perl имеет множество модулей Getopt, что отражает, сколько усилий было вложено в течение многих лет.)

Вы можете найти полезную дополнительную информацию на What is the general syntax of a Unix shell command. Вы также можете прочитать спецификацию POSIX для условных обозначений командной строки в главе Utility Conventions.

+0

Существует только одна плохая вещь о GNU getopt(), и это лицензия. – Anonymous

+1

Да - это по крайней мере LGPL в эти дни. Это был полный GPL. Вы можете получить не-GNU версии getopt(). Например, AT & T опубликовала источник на пути UseNet. –

+2

Хорошая спецификация того, как утилит POSIX предназначена для работы, приведена в главе POSIX [Утилиты условных обозначений] (http://www.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap12.html). –

18

Если вы хотите что-то полностью кроссплатформенное, я нашел, что библиотека Boost::Program_Options будет очень хорошей. Есть кое-что из кривой обучения, чтобы настроить его, но как только вы справитесь с этим, это значительно упростит ситуацию.

+0

Плохая вещь об этой библиотеке заключается в том, что она не является «только заголовком», в отличие от большинства других компонентов Boost. Я никогда не понимал, почему это так. – becko

+0

Просто потому, что разработчик решил сделать это именно так. Я стал менее влюбленным в него, так как я тоже это написал. Это хорошо, и кросс-платформенный, но я считаю, что большую часть времени я предпочитаю обрабатывать варианты с помощью своего собственного кода. Время, затрачиваемое на запись парсера параметров с нуля, часто меньше, чем мне стоило бы выяснить, как настроить код библиотеки, чтобы сделать то же самое, особенно, поскольку мне не нужно иметь дело с файлами конфигурации, только параметры командной строки. –

+1

Тот факт, что Boost :: Program_Options не является только заголовком, является проблемой, потому что Boost часто обновляет версию. Это означает, что если вы не привязываетесь статически к Boost :: Program_Options, ваша программа не будет запущена на всех машинах с неправильной версией Boost! – becko

1

Я использую системную реализацию getopt_long() для большинства вещей, однако вам может потребоваться быть более портативным, что запрещает использование таких удобств для существ POSIX.

Here is the standard относительно представления POSIX параметров командной строки, если вы находитесь в положении, когда getopt()/getopt_long() просто недоступны и вам нужно сворачивать свои собственные. Вам также может понадобиться посмотреть, что POSIX может сказать о сводных показаниях справки/опции (я не могу найти ссылку на эту часть стандарта вне руки).

Лично я не люблю использовать программы, которые не принимают -long-options, потому что помнить короткие варианты - это боль, и никакие две программы не используют то же самое.

6

boost::program_options довольно хороший и имеет хороший интерфейс C++, который может проверить, что параметры параметра имеют определенный тип (например, «int») и хранят их непосредственно в переменных.

Он также поддерживает загрузку «параметров» из конфигурационного файла, поэтому вы можете бесплатно получить синтаксический файл конфигурационного файла. Таким образом, вы можете очень легко переопределить все параметры конфигурации из командной строки или добавить все параметры командной строки в файл конфигурации, что делает его очень гибким.