Создайте эквивалент C ‘argv’ из вектора строк

#c #boost-program-options

Вопрос:

У меня есть некоторый устаревший код C , который принимает входные параметры. Он представлен в следующем формате:

 int main(int argc,char* argv[])
{
    parse_args(argc,argv);
    return 0;
}
 

Входные данные должны были быть указаны в следующем формате:

 $ ./a.out -f sample.txt -o out.xml
 

Теперь мне нужно изменить приведенный выше код, чтобы иметь возможность принимать входные данные, указанные в файле конфигурации ввода, с помощью функции boost::program_options::parse_config_file, чтобы входные данные можно было указать как:

 $ ./a.out -cfg config.cfg
 

Где содержимое файла «config.cfg» выглядит следующим образом:

 f=sample.txt
o=out.xml
 

Я хотел бы сделать это без внесения каких-либо изменений в parse_args() функцию.

Следовательно, не могли бы вы предложить метод преобразования входных аргументов, проанализированных из файла cfg (считайте, что это вектор строк), в формат, эквивалентный char* argv[] формату ?

Комментарии:

1. Преобразуйте результат parse_config_file() в std::vector<char*> строки в стиле C {"f", "sample.txt", "o", "out.xml"} , т. Е. Затем вы можете перейти vector.data() и vector.size() к parse_args()

2. @RemyLebeau: Не забудь нажать nullptr «а». argv является nullptr-прекращено

3. @MSalters argc указывает количество char* s в argv , значение null не требуется

4. @RemyLebeau: Вы смотрите на это с неправильной стороны контракта. main устанавливает последний элемент argv to nullptr , и реализация parse_args может зависеть от этого, или она может зависеть от argc этого . Да, как main это делается, технически избыточно, но именно так это работает. Этот код пытается эмулировать один и тот же argv[] массив, поэтому он должен иметь одинаковую избыточность.