2016-07-14 3 views
0

Кто-нибудь знает, как указать взаимоисключающие опции с argp в C? Можно ли использовать трюк?взаимоисключающие опции с argp в C

EDIT

Что взаимоисключающие варианты?

Скажите, что у вас есть какая-то командная строка utility. Вы набираете utility --help и результат выглядит следующим образом

utility [-a|-b] 

Варианты -a и -b являются взаимоисключающими, потому что никто не может указать их вместе, то есть с указанием -a исключает использование -b. То же самое справедливо и для -b. Если он используется, то нельзя указать -a. Другими словами, возможно только следующее:

utility -a или utility -b.

Из документации argp не представляется возможным указать этот вариант. Итак, вопрос в том, какие трюки используют люди, чтобы указать такой вариант? Я уверен, что необходимость в этом возникала не раз в чьем-то опыте.

+0

Что 'argp'? –

+0

Вы имеете в виду 'argc' и' argv'? – stackptr

+0

Вы имеете в виду 'argp', который является' glibc' specific? Пример программы, например [this] (http://crasseux.com/books/ctutorial/argp-example.html)? – user3078414

ответ

0

Я не знаю, имеет ли функция argp функцию, которую вы хотите, но вы уверены, что хотите ее? Вам нужно будет описать отношения и предоставить сообщение, нет?

Традиционно getopt только разобранные аргументы. Вы не можете указать обязательный, факультативный или какой-либо вариант. Цикл getopt прошел более argv и обрабатывал каждую опцию (и аргумент) по очереди. Как только это будет сделано, вы исследуете результаты и решаете любые конфликты.

switch(ch) { 
    case 'a': foo = true; break; 
    case 'b': bar = true; break; 
} 
if(foo && bar) { 
    errx(EXIT_FAILURE, "foo and bar cannot be used together"); 
} 

Это выглядит просто и понятно. Я не хотел бы пытаться выразить это в грамматике с опциональной строкой.

+0

Я мог бы пойти с вами. – flashburn

0

Программа, которая имеет два взаимоисключающих опциона, -a и -b, обычно не останавливает пользователя от указания как в командной строке.

Вместо этого программа будет анализировать -a, а затем установить некоторую внутреннюю переменную, возможно opt_ab = 1. Позже, получив парсинг -b, переменная будет установлена ​​opt_ab = 0. Это будет последний вариант в командной строке, который вступил в силу.

Вот как это делается в подавляющем большинстве инструментов командной строки. У вас есть, например:

$ ls -1 -C 

против

$ ls -C -1