你好,这是一个非常初级的问题,但我就是想不明白:
我有一个名为“bar”的函数。
class foo
{
public:
bool bar(int argc, char** argv);
}
argv应该包含
"--dir" and "/some_path/"
我该如何创建 argv 和 argc 并将它们传递给 bar() 函数?我尝试了很多种方法,但是指针和类型转换总是有问题。
因此,我想在代码中创建 argv,而不是从命令行获取它。
谢谢任何意见!
你好,这是一个非常初级的问题,但我就是想不明白:
我有一个名为“bar”的函数。
class foo
{
public:
bool bar(int argc, char** argv);
}
argv应该包含
"--dir" and "/some_path/"
我最喜欢的方式是这样的:
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(未定义行为)。通常情况下不会出现这种情况。
const char *
到 char *
的隐式转换。 - Slava&arg[0]
而无需任何转换。无论如何,我更喜欢使用const_cast<>
而不是C风格的转换。 - Slavafor (const auto& arg : arguemnts)
里打错字了,应该是 arguments
。 - Ivan Kush假设你希望以与传递给 main
相同的格式获取 argc 和 argv,那么可以这样调用它:
foo f;
char *args[] = {
(char*)"--dir",
(char*)"/some_path/",
NULL
};
f.bar(2, args);
bar
不会修改参数字符串——如果会修改,那么你需要将参数类型从 char **
改为 const char **
)const char *
转换为char *
是非法的。 - Slava