1

我试图理解一个类的一段骨架代码。预期用途是:

./a.out -d -n Foo -i Bar

骨架代码工作正常,但我从未使用过getopt()也无法理解为什么它可以正常工作(理解它与分配无关,我只是想理解它)。它如何更新/退出while循环?我根本没有看到指针增量或循环中传递给它的参数发生变化。

char *optString = "-d-n:-i:";
int opt = getopt(argc, argv, optString);

while (opt != -1) {
    switch(opt) {
    case 'd':
        debug = 1;
        break;
    case 'n':
        nameserver_flag = 1;
        nameserver = optarg;
        break;
    case 'i':
        hostname = optarg;
        break;
    case '?':
        usage();
        exit(1);
    default:
        usage();
        exit(1);
    }
    opt = getopt(argc, argv, optString);
}
4

2 回答 2

2

对 getopt 的每次调用都会处理 argv 中的多个参数,并在 opt 中返回结果等等。还有什么要理解的?

于 2013-09-26T04:50:11.257 回答
2

getopt使用全局变量来存储参数索引、要解析的下一个字符和一些其他信息。每次您调用 时getopt,该函数都会检查这些变量以了解它上次在哪里(或者您告诉它在哪里),并为下一次调用更新变量。

最重要的是,optind将索引存储在argv要扫描的下一个元素中。

于 2013-09-26T04:55:26.877 回答