为了解决我的问题here,我想知道是否/如何以char** argv
或char* argv[]
以外的格式定义命令行参数的第二个变量。 The reason是pybind11不允许函数输入中的任何一个。这是我尝试过的方法:
#include <stdio.h>
int main(int argc, int* argv_){
for (int i = 0; i < argc; ++i){
printf("%s\n", (char *)(argv_[i]));
}
}
此方法的原理是,指针本质上是一个整数,并且通过将地址强制转换为char
指针,就应该能够获取字符串。感谢您的提前支持。
#include <stdio.h>
#include <string>
int main(int argc, std::string* argv_){
for (int i = 0; i < argc; ++i){
printf("%s\n", argv_[i].c_str());
}
}
#include <stdio.h>
#include <string>
#include <vector>
int main(int argc, std::vector<std::string> argv_){
for (int i = 0; i < argc; ++i){
const char* argv__ = argv_[i].c_str();
printf("%s\n", argv_[i].c_str());
}
}
[不幸的是,以上所有方法都导致了臭名昭著的segmentation fault
。
如果您能帮助我知道问题出在哪里(即内存泄漏在哪里)以及如何解决它们,我将不胜感激。
在评论中,我被告知,如果使用除main()
,main(int argc, char** argv)
或main(int argc, char* argv[])
以外的任何其他形式,它将不可避免地导致segmentation fault
。但是,下面的代码有效:
#include <stdio.h>
int main(int argc, long* argv_){
for (int i = 0; i < argc; ++i){
printf("%s\n", (char *)(argv_[i]));
}
}
这适用于Ubuntu minimal和g++ 7.4.0
,以及Windows 10 Visual Studio 2019编译器。但是,它不能用clang
进行编译。正如其他人指出的那样,这不是解决方案,也不是很糟糕的做法。它可能导致不确定的行为,具体取决于编译器,操作系统和内存的当前状态。任何C / C ++代码中的主要功能都必须为main()
,main(int argc, char** argv)
或main(int argc, char* argv[])
形式。
为了在这里解决我的问题,我想知道是否/如何以char ** argv或char * argv []以外的格式定义命令行参数的第二个变量。原因是pybind11不会...
看起来好像根本不需要是main
,所以您可以这样:
让我们尝试解决在漫长的讨论中出现的过多问题。首先,让我们看看您的问题是什么。
main
函数的,是您可以将main
定义为不带参数,或带参数(int, char**)
。任何其他可能的变体都由实现定义,并且您应该查看编译器的文档,以查看它们是否支持任何其他变体: