create argc argv in the code

KKsan picture KKsan · Oct 5, 2016 · Viewed 9.2k times · Source

Hi very newbie question but I just can't figure it out:

I have a function named bar

class foo
{
    public:
        bool bar(int argc, char** argv);
}

argv is supposed to contain

"--dir" and "/some_path/"

How do I create argv and argc so that I can pass them into bar() ? I've tried many ways but I just can't get pointer and type conversion right.

So instead of getting argv from command line, I want to create it in the code.

Thank you for any input!

Answer

Alexey Guseynov picture Alexey Guseynov · Oct 5, 2016

My favourite way is like this:

std::vector<std::string> arguments = {"--dir", "/some_path"};

std::vector<char*> argv;
for (const auto& arg : arguments)
    argv.push_back((char*)arg.data());
argv.push_back(nullptr);

f.bar(argv.size() - 1, argv.data());

Note, that if arguments are static and do not change, then this is a little bit overkill. But this approach has advantage of being RAII compliant. It manages memory for you and deletes objects at right moment. So if argument list is dynamic, then it is the cleanest way.

Beside that, this code technically is UB if f.bar modifies data in argv array. Usually this is not the case.