Самый эффективный способ обработки аргументов из командной строки в C ++ - PullRequest
9 голосов
/ 14 января 2009

Предложения по аргументу командной строки эффективная обработка в C ++:

Примечание : только для Windows

 1:     #include <iostream.h>
 2:     int main(int argc, char **argv)

Вместо, например:

 if ( argc != 3 )  {
      ....
 }

Привет

Ответы [ 7 ]

18 голосов
/ 14 января 2009

Если вы просто хотите обработать параметры командной строки самостоятельно, способ самый простой состоит в следующем:

vector<string> args(argv + 1, argv + argc);

в верхней части вашего main(). Это копирует все аргументы командной строки в вектор std::string s. Затем вы можете легко использовать == для сравнения строк вместо бесконечных strcmp() вызовов. Например:

int main(int argc, char **argv) {
    vector<string> args(argv + 1, argv + argc);
    string infname, outfname;

    // Loop over command-line args
    // (Actually I usually use an ordinary integer loop variable and compare
    // args[i] instead of *i -- don't tell anyone! ;)
    for (vector<string>::iterator i = args.begin(); i != args.end(); ++i) {
        if (*i == "-h" || *i == "--help") {
            cout << "Syntax: foomatic -i <infile> -o <outfile>" << endl;
            return 0;
        } else if (*i == "-i") {
            infname = *++i;
        } else if (*i == "-o") {
            outfname = *++i;
        }
    }
}

[ПРАВКА: Я понял, что копирую argv[0], название программы, в args - исправлено.]

14 голосов
/ 14 января 2009

С C ++ ответ обычно в Boost ...

Параметры Boost.Program

5 голосов
/ 21 апреля 2009

Есть много хороших доступных библиотек.

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

SimpleOpt - довольно сложный, но простой процессор командной строки. Это отдельный файл, имеющий простую структуру, но он обрабатывает только разбор командной строки до параметров, вам нужно выполнить все проверки типов и диапазонов. Он хорош как для Windows, так и для Unix и поставляется с версией glob для Windows.

getopt доступен в Windows. Он такой же, как на машинах Unix, но часто это библиотека GPL.

5 голосов
/ 14 января 2009

Я бы предложил использовать библиотеку. Есть классический и почтенный getopt , и я уверен, что другие.

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

Это мой любимый способ работы с командной строкой, особенно, но определенно не только тогда, когда эффективность является проблемой. Это может показаться излишним, но я думаю, что у этого недостатка есть несколько недостатков.

Использование gperf для эффективной обработки командной строки C / C ++

Недостатки:

  • Сначала нужно запустить отдельный инструмент, чтобы сгенерировать код для хеш-таблицы в C / C ++
  • Нет поддержки для определенных интерфейсов командной строки. Например, будет сложно реализовать систему сокращений posix «-xyz», объявляющую несколько опций одним штрихом.

Преимущества:

  • Ваши параметры командной строки хранятся отдельно от вашего кода C ++ (в отдельном файле конфигурации, который не нужно читать во время выполнения, только во время компиляции).
  • Все, что у вас есть в вашем коде, это ровно один переключатель (включающий значения enum), чтобы выяснить, какой вариант у вас есть
  • Эффективность - O (n), где n - количество опций в командной строке, а количество возможных опций не имеет значения. Возможно, самой медленной частью является реализация переключателя (иногда компиляторы, как правило, реализуют их как блоки, снижая их эффективность, хотя это маловероятно, если вы выберете смежные значения, см. эту статью об эффективности переключателя )
  • Память, выделенная для хранения ключевых слов, достаточно велика для набора ключевых слов и не больше.
  • Также работает в C

Используя IDE, такую ​​как eclipse, вы, вероятно, можете автоматизировать процесс запуска gperf, поэтому единственное, что вам нужно сделать, это добавить опцию в файл конфигурации и в оператор switch и нажать build ...

Я использовал командный файл для запуска gperf, а также для очистки и добавления include guard с sed (для файла .hpp, сгенерированного gperf) ...

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

0 голосов
/ 27 октября 2010

Попробуйте библиотеку CLPP. Это простая и гибкая библиотека для разбора параметров командной строки. Только заголовок и кроссплатформенность. Используются только библиотеки ISO C ++ и Boost C ++. ИМХО это проще, чем Boost.Program_options.

Библиотека: http://sourceforge.net/projects/clp-parser

26 октября 2010 - новый релиз 2.0rc. Исправлено множество ошибок, исправлен полный рефакторинг исходного кода, документации, примеров и комментариев.

0 голосов
/ 14 января 2009

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

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