Я немного опоздал на вечеринку с этим, но я предоставлю обновленный ответ. На самом деле вы можете получить ту функциональность, которая вам нужна в C ++, немного поработав с помощью 'getopt'. Используя getopt_long()
, вы можете создавать либо односимвольные параметры (например, -c
), либо именованные (например, --input
). Вы также можете использовать getopt_long_only()
, что позволит вам передавать именованные опции только с одной чертой. См. Например здесь или этот ответ .
Пример
Вот пример, который должен выполнить то, что вы пытаетесь сделать:
#include <iostream>
#include <getopt.h>
#include <map>
#include <string>
int main (int argc, char** argv)
{
// Create the variables to store your parameters
std::map<std::string, std::string> input_parameters ;
input_parameters["input"] = "default_in" ; // Storage for input
input_parameters["output"] = "default_out" ; // Storage for output
// Create variables to hold your parameters
const struct option longopts[] =
{
{"input", required_argument, 0, 'i'},
{"output", required_argument, 0, 'o'},
{0,0,0,0} // This tells getopt that this is the end
};
// Some parameters for getopt_long
int c(0);
// Get the options from the command line
while (c != -1) {
int option_index(-1) ;
// Read the next command line option
// Note here that the ':' after the 'i' and 'o' denotes that
// it requires an argument
c = getopt_long(argc, argv, "i:o:", longopts, &option_index) ;
// If the option is valid, fill the corresponding value
if ((c>0)&&(option_index>=0)) {
std::cout << option_index << std::endl;
input_parameters[longopts[option_index].name] = optarg ;
}
switch (c) {
case 'i':
// Fill input option
input_parameters["input"] = optarg ;
case 'o':
// Fill output option
input_parameters["output"] = optarg ;
case '?':
// getopt_long printed an error message
break ;
}
}
std::cout << "input = " << input_parameters["input"] << std::endl;
std::cout << "output = " << input_parameters["output"] << std::endl;
return 0 ;
}
Обратите внимание, что здесь вы должны выполнить это, оставив пробел между параметром и значением, которое вы хотите передать ему. Это даст следующее:
$ ./myscript --input inputfile.txt --output outputfile.txt
input = inputfile.txt
output = outputfile.txt
или
$ ./myscript -i inputfile.txt -o outpufile.txt
input = inputfile.txt
output = outputfile.txt
Вы также можете использовать --input
и -i
взаимозаменяемо (аналогично --output
и -o
).
Начните бесстыдный плагин (мой собственный CLOptions код, построенный на основе getopt)
На самом деле я был немного недоволен количеством работы, которое потребовалось, чтобы получить полную функциональность getopt с параметрами, которые могут быть либо логическими, double, int или string. Мне также пришлось создать совершенно новую реализацию в КАЖДОМ ПРОЕКТЕ! Итак, вместо этого я собрал быстрый класс под названием «CLOptions», чтобы я мог #include "CLOptions.h"
в своем коде (все в одном файле), и теперь мне нужна только одна строка для определения каждой дополнительной опции. Он также создает опции -h
или -help
для печати справочной информации для вас! Он включает в себя функциональность для получения каждого параметра как bool, double, int или string в зависимости от того, как вы определяете каждый параметр. Вы можете взглянуть на это на GitHub здесь с примером , как вышеуказанный метод может быть реализован . Обратите внимание, что класс C ++ 11 и для него потребуется -std=c++11
во время компиляции (хотя, если кто-то спросит, я могу попытаться кодировать версию C).
Хотя я не пробовал их, есть также множество других программ командной строки, которые были разработаны другими людьми для решения этой проблемы (например, options или dropt ) , Вы, вероятно, можете найти их, погуглив вокруг.