在代码中创建 argc argv

新手上路,请多包涵

嗨,非常新手的问题,但我就是想不通:

我有一个名为 bar 的函数

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

argv 应该包含

"--dir" and "/some_path/"

如何创建 argv 和 argc 以便我可以将它们传递给 bar() ?我尝试了很多方法,但我无法正确地进行指针和类型转换。

因此,我不想从命令行获取 argv,而是想在代码中创建它。

感谢您的任何意见!

原文由 KKsan 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 779
2 个回答

我最喜欢的方式是这样的:

 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());

请注意,如果参数是静态的并且不会改变,那么这有点矫枉过正。但是这种方法具有符合 RAII 的优点。它为您管理内存并在适当的时候删除对象。因此,如果参数列表是动态的,那么它是最干净的方式。

除此之外,如果 f.bar 修改了 argv 数组中的数据,则此代码在技术上是 UB。通常情况并非如此。

原文由 Alexey Guseynov 发布,翻译遵循 CC BY-SA 3.0 许可协议

假设您希望传递给 main 的 argc 和 argv 格式相同,您可以这样称呼它:

 foo f;
char *args[] = {
    (char*)"--dir",
    (char*)"/some_path/",
    NULL
};
f.bar(2, args);

(注意:这假设 bar 不会修改参数字符串 - 在这种情况下,您应该将参数类型更改为 const char ** 而不是 char **

原文由 user253751 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题