我们可以在 getopt_long 函数中使用动态数组 data() 作为 longopts 参数吗?

问题描述

我正在尝试在 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 无法知道数组中有多少元素。从链接的手册页:

数组的最后一个元素必须用零填充。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...