正确或体面的 getopts_long 用法?

Correct or decent getopts_long usage?

如果我想要这种行为,正确的用法是什么:

$ ./a.out --help 打印帮助信息

$ ./a.out --version用于打印程序版本

我设法对此进行了编码,以便它接受参数,但我不知道分隔消息的好/正确方法,因为它们是相同的大小写。

static struct option long_options[] = {
        {"help",  no_argument,       0,  0 },
        {"version", no_argument,       0,  0 },
        {0,         0,                 0,  0 }
};


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


    while (1) {
        int this_option_optind = optind ? optind : 1;
        int option_index = 0;


        c = getopt_long(argc, argv, "",
                        long_options, &option_index);
        if (c == -1)
            break;

        switch (c) {
            case 0:
                printf("option %s", long_options[option_index].name);
                if (optarg)
                    printf(" with arg %s", optarg);
                printf("\n");
                return 0;

            case '0':
            case '1':
            case '2':
                if (digit_optind != 0 && digit_optind != this_option_optind)
                    printf("digits occur in two different argv-elements.\n");
                digit_optind = this_option_optind;
                printf("option 2 2 %c\n", c);
                return 0;

            case 'a':
                printf("option a\n");
                break;

            case 'b':
                printf("option b\n");
                break;

            case 'c':
                printf("option c with value '%s'\n", optarg);
                break;

            case 'd':
                printf("option d with value '%s'\n", optarg);
                break;

            case '?':
                break;

            default:
                printf("?? getopt returned character code 0%o ??\n", c);
        }
    }

    if (optind < argc) {
        printf("non-option ARGV-elements: ");
        while (optind < argc)
            printf("%s ", argv[optind++]);
        printf("\n");
    }

...

您需要告诉 getopt_long 它具有的值 return:

static struct option long_options[] = {
    {"help",  no_argument,      NULL,  1 },
    {"version", no_argument,    NULL,  2 },
    {0,         0,                 0,  0 }
};

此外,您可以将“-h”用作“--help”的同义词,将“-V”用作“--version”的同义词,方法如下:

static struct option long_options[] = {
    {"help",  no_argument,      NULL,  'h' },
    {"version", no_argument,    NULL,  'V' },
    {0,         0,                 0,  0 }
};

    /* ... */

    c = getopt_long(argc, argv, "abc:d:Vh", long_options, &option_index);

    /* ... */

    case 'h': // instead of case 1:

    /* ... */

    case 'V': // instead of case 2:

    /* ...*/

这里有一个例子:

while (1)
{
    int option_index = 0;
    static struct option long_options[] = {
        {"with_param", required_argument, 0, 'p'},
        {"version", no_argument, 0, 'v'},
        {"help", no_argument, 0, 'h'},
        {0, 0, 0, 0}
    };

    option = getopt_long(argc, argv, "p:vh",
                         long_options, &option_index);
    if (option == -1)
        break;

    switch (option) {
    case 'p':
    {
        store_parameter(optarg);
        break;
    }
    case 'v':
    {
        print_version();
        break;
    }
    case 'h':
    {
        print_help();
        exit(EXIT_SUCCESS);
        break;
    }
    default:
    {
        fprintf(stderr, "Error (%s): unrecognized option.\n", __FUNCTION__);
        print_help();
        exit(EXIT_FAILURE);
        break;
    }
    } /* end switch */
}

注意字符串 "p:vh" 作为 getopt_long 的参数,它允许您也使用短选项。 (":" 跟随带有必需参数的选项)