问题描述
我正在尝试在 C++ 上创建一个将使用 getopt_long
函数的参数解析类。
所以基本上我希望可以动态创建 longopts
参数。
此代码,使用静态数组作为 longopts
参数将起作用:
int main(int argc,char **argv) {
while (true) {
static struct option long_options_static[] = {
{"a",required_argument,'a'},{"b",'b'},};
int option_index = 0;
char c = getopt_long(argc,argv,"",long_options_static,&option_index);
}
return 0;
}
但是这个,使用 std::vector
将编译但不能按预期工作:
int main(int argc,char **argv) {
while (true) {
std::vector<struct option> long_options_vect(2);
long_options_vec[0] = {"a",'a'};
long_options_vec[1] = {"b",'b'};
int option_index = 0;
char c = getopt_long(argc,long_options_vect.data(),&option_index);
}
return 0;
}
从getopt_long
manual,它只说明
longopts 是指向结构选项数组第一个元素的指针...
所以理论上,使用任何类型的容器(例如 std::vector 或 std::array ,然后传递存储的指针都是可能的,对吗?
但是我收到 unrecognized option
错误,我是否遗漏了什么?
解决方法
数组需要包含一个特殊的哨兵值来指示它的结束。否则,getopt_long
无法知道数组中有多少元素。从链接的手册页:
数组的最后一个元素必须用零填充。