使用 getopt_long (C++) 我如何编写一个 long & short 选项来要求参数?

Posted

技术标签:

【中文标题】使用 getopt_long (C++) 我如何编写一个 long & short 选项来要求参数?【英文标题】:Using getopt_long (C++) how do I code up a long & short option to both require arguments? 【发布时间】:2012-02-06 06:13:30 【问题描述】:
#include <iostream>
#include <getopt.h>

#define no_argument 0
#define required_argument 1 
#define optional_argument 2


int main(int argc, char * argv[])

  std::cout << "Hello" << std::endl;

  const struct option longopts[] =
  
    "version",   no_argument,        0, 'v',
    "help",      no_argument,        0, 'h',
    "stuff",     required_argument,  0, 's',
    0,0,0,0,
  ;

  int index;
  int iarg=0;

  //turn off getopt error message
  opterr=1; 

  while(iarg != -1)
  
    iarg = getopt_long(argc, argv, "svh", longopts, &index);

    switch (iarg)
    
      case 'h':
        std::cout << "You hit help" << std::endl;
        break;

      case 'v':
        std::cout << "You hit version" << std::endl;
        break;

      case 's':
        std::cout << "You hit stuff" << std::endl;
        break;
    
  

  std::cout << "GoodBye!" << std::endl;

  return 0; 

输出:

./a.out -s
Hello
You hit stuff
GoodBye!

输出:

./a.out --stuff
Hello
./a.out: option `--stuff' requires an argument
GoodBye!

需要解决的冲突: -s 和 --s 都应该说:./a.out: option `--stuff' requires an argument 在不继续使用时命令后面的参数。但只有 --stuff 可以吗?有人知道我在这里缺少什么吗?

期望的结果:

./a.out -s
     Hello
     ./a.out: option `--stuff' requires an argument
      GoodBye!

./a.out --stuff
     Hello
     ./a.out: option `--stuff' requires an argument
     GoodBye!

【问题讨论】:

只是一点点:可能不需要那些#define语句,因为在包含getopt.h时应该将同名变量声明为枚举,因此重新定义可能会引发错误.如果某些深奥的、陈旧的或其他损坏的平台的 getopt.h 没有声明这些变量,那么 #defines 可能应该包含在 #ifdef 中,以检查仅在该特定平台上定义的某些变量。 【参考方案1】:

您的 getopt_long 调用在应该显示“s:vh”时为短选项指定“svh”。冒号告诉 getopt 要求“s”的参数。

【讨论】:

非常感谢。那行得通,我想我没有仔细阅读手册页。非常感谢。【参考方案2】:

我很确定您需要将“svh”替换为“s:vh”。根据 getopt_long 的 Linux 手册页,“optstring 是一个包含合法选项字符的字符串。如果这样的字符后跟冒号,则该选项需要一个参数,”。

【讨论】:

以上是关于使用 getopt_long (C++) 我如何编写一个 long & short 选项来要求参数?的主要内容,如果未能解决你的问题,请参考以下文章

如何将 C++ 文件编译为 WebAssembly?

getopt()与getopt_long()的使用简介

getopt_long()备忘

使用 `getopt_long` 时了解 `option long_options[]`

getopt与getopt_long

为啥我可以在 Mac OS X 上使用 Cython 编译为 C 但不能编译为 C++