在这篇帖子中,我找到了一个临时解决方案来解决我的另一个问题,现在我想知道是否可以用std::vector<std::string>
变量/对象替换int argc, char** argv
。
考虑以下虚构代码:
#include <iostream>
#include <CloseLibrary>
void someFunction(int argc, char** argv){
for (int i = 0; i < argc; ++i) {
std::cout << argv[i] << std::endl;
}
}
int myFunc(int argc, char** argv){
someFunction(argc, argv);
return 0;
}
在这里,CloseLibrary
是一个我无法访问源代码的封闭库,而该库中的 someFunction
函数需要 int argc,char ** argv
命令行参数。但由于某些原因,我不能在我的代码中使用双指针 char**
。
出于某种原因,我需要类似于这篇文章中提出的东西,但我不知道如何使用它。我可以这样编写代码吗:
#include <iostream>
#include <CloseLibrary>
#include <vector>
void someFunction(int argc, char** argv){
for (int i = 0; i < argc; ++i) {
std::cout << argv[i] << std::endl;
}
}
int myFunc("args", [](std::vector<std::string> args){
std::vector<char *> cstrs;
cstrs.reserve(args.size());
for (auto &s : args) cstrs.push_back(const_cast<char *>(s.c_str()));
someFunction(cstrs.size(), cstrs.data());
return 0;
}
也许有更加规范的方法来完成这个任务?如果您能帮我找到正确的方法并理解解决方案,我将不胜感激。非常感谢您的帮助。
P.S.1. 在函数体中使用char* argv[]
方法是可以的,但在输入中不行。我不知道为什么pybind11会这样做!
P.S.2. 在pybind11 gitter上, 有人建议:
void run(const std::vector<std::string>& args) {
for(auto&& e : args) std::cout << e << '\n';
}
P.S.3. 在 pybind11 Gitter 上也被建议:
char** argv = new char*[vec.size()]; // just like malloc(sizeof(char*)*vec.size());
for (int i = 0; i < vec.size(), i++) {
argv[i] = new char[vec[i].size()];
memcpy(argv[i], vec[i].data(), vec[i].size()); // or strcpy
}
char** argv
或char* arg[]
之外的任何形式获取命令行参数的第二个参数。我最初认为可以使用某种形式的std::vector<std::string>
,但我不确定是否可能。也许是char* argv_
或void* argv_
。2.如何将第二个参数转换/解析为char* argv[]
的形式,因为这在函数体中是可能的。 - Foad S. Farimanichar** var
和char* var[]
不被允许的原因是由于pybind11的限制,如此处所述。我在原始帖子中链接了所有这些参考资料。此外,随着我进一步研究并尝试添加新信息到**P.S.**中,问题正在逐渐展开。 - Foad S. Farimani