C: getopt со списком приемлемых optarg. Какова лучшая практика? - PullRequest
0 голосов
/ 01 июня 2010

Я пишу программу на C, которая является интерфейсом к множеству инструментов. Этот фронт будет запущен так:

my-frontend --action <AN ACTION>

Поскольку все инструменты имеют одинаковый префикс, скажем, для этого примера этот префикс "foo". Я хочу объединить «ДЕЙСТВИЕ» с этим префиксом и выполнить его (если инструмент существует).

Я написал что-то, но моя реализация использует strcmp для проверки того, что «ДЕЙСТВИЕ» является допустимым действием. Даже если это работает, мне это не нравится. Поэтому я ищу лучшее решение, которое бы делало то же самое. Список возможностей довольно мал (меньше 10) и статичен (список «жестко закодирован»), но я уверен, что есть более «C-ish» способ сделать это (используя структуру или что-то подобное) Поскольку я не эксперт по Си, я прошу вашей помощи.

Привет

1 Ответ

2 голосов
/ 01 июня 2010

Взгляните на getopt_long . Его часть стандартной библиотеки C. Для полной документации о том, как программы на C должны обрабатывать аргументы стандартным способом UNIX, проверьте это .

Вышесказанное должно дать вам аргумент. Но я вижу, что ваша проблема не только в этом. Работа с несколькими бэкэндами может быть сделана так:

struct cmds {
        char *name;
        void (*cmd)(int argc, char **argv);
};

Вы можете объявить cmd_table следующим образом:

struct cmds cmd_table[] = {
        { "backend1", backend1_exec },
        { "backend2", backend2_exec },
        ...
};

backend1_exec() и backend2_exec() - это просто функции, которые действительно выполняют основную работу по выполнению настоящего бэкэнда для вас.

Затем в вашей функции main() просто зациклите записи, сравнивая каждую запись в cmd_table с аргументом, а затем вызывайте соответствующую внутреннюю функцию следующим образом:

if (strcmp(cmdname, cmd_table[i].name)) {
        *(cmd_table[i].cmd)(argc, argv);
}

Да, нет ничего плохого в использовании strcmp(), если вы только что получили 10 записей в таблице. Это не критичный к производительности раздел вашей программы, так что я бы не стал сильно беспокоиться об этом. Этот метод является популярным способом справиться с этим, как я уже видел (это не делает его авторитетным, но может помочь вам заверить, что вы не делаете ничего плохого).

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