C getopt 和 getopt_long 是否仅适用于主要参数?

Do C getopt and getopt_long only work for main arguments?

问题很清楚,我想知道因为那个人说

The getopt() function parses the command-line arguments.

我正在尝试将它与另一个具有与 main 相同签名的函数一起使用,并且 argcargv 是通过 wordexp 获得的,所以一切看起来都一样,但是在调用 getopt 时,我在调用 getopt_long.

后立即出现分段错误
#define   OPT_HELP    'h'
#define   OPTL_HELP   "help"
#define   OPT_MESS    'm'
#define   OPTL_MESS   "message"

#define   OPT_STRING  "hm:"

struct option longopts[] = {
  {OPTL_HELP,     no_argument, 0, OPT_HELP},
  {OPTL_MESS,     required_argument, 0, OPT_MESS},
  {0, 0, 0, 0}
};

#define FLAG_MESS 1

void cmd_chat(int argc, char **argv)
{
  int c, indexptr;
  short flag = 0;
  char message[481];
  while ((c = getopt_long(argc, argv, OPT_STRING,
          longopts, &indexptr)) != -1) {
    debug(MAGENTA "cmd_chat", MAGENTA "c value: %d", c);
    switch (c) {
      case OPT_HELP:
        debug(MAGENTA "cmd_chat", MAGENTA "calling help");
        help(argv[0]);
        return;
        break;
      case OPT_MESS:
        flag |= FLAG_MESS;
        strncpy(message, optarg, 481);
        break;
      default:
        usage(argv[0]);
        break;
    }
  }


[...]

可能是这样,但如果是这样,我想知道为什么会这样,为什么我们应该将 argcargv 传递给 getopt(_long) .

谢谢。

getopt()getopt_long() 都适用于每个适当的 char **intargv 和任何其他 [=12] 没有区别=]. 如果您将 argvargc 或它们的副本从 main 传递到您的函数并从那里调用 getopt(),它将起作用。显示您的函数如何获得 argcargv;