getopt函数概述

getopt函数用于解析命令行参数

/**
 * 解析命令行参数
 * @param argc 对应main函数argc
 * @param argv 对应main函数argv
 * @param optstring 定义选项需求字符串
 * @return 有效选项字符串 -1:所有选项解析完毕 ?:遇到未知选项(默认会打印错误) :线下缺少参数(默认会打印错误)
 */
int getopt(int argc, char * const argv[], const char *optstring)

全局变量

getopt函数依赖的全局变量

  • optarg 指向当前选项的指针(如果选项无参数则为NULL)
  • optind 下一个待处理的 argv索引
  • opterr 控制是否显示错误信息(默认为1显示错误,设置为0表示不显示错误信息)
  • optopt 记录最后一个未知选项的字符

opstring参数格式

格式 说明
字符 表示一个无需参数的选项
字符: 表示该选项必须带参数,参数可以相连也可以不相连(-a value-avalue
字符:: 表示该选项参数可选,如果带参数必须直接相连(-avalue
getopt(argc, argv, "ab:c::");

  • a 表示一个无需参数的选项
  • b 表示该选项必须带参数
  • c 表示该选项参数可选

getopt_long函数概述

glibc 中的函数 getopt_long可以用来解析长选项。

#include <getopt.h>
int getopt_long(int argc, char * const argv[],
                const char *optstring,
                const struct option *longopts,
                int *longindex);

参数说明

  • longopts 为指向 struct option 数组的指针,定义长选项参数
  • longindex 返回长选项在 longopts 数组中的索引

struct option 结构体

struct option {
    const char *name;    // 长选项名称(如 "help")
    int has_arg;         // 参数需求: no_argument(无参数)、required_argument(必须带参数)、optional_argument(可选参数)
    int *flag;           // 控制返回值(NULL 表示直接返回 val)
    int val;             // 返回值(或写入 flag 的值)
};
    // 定义长选项表
    struct option long_options[] = {
        {"help",     no_argument,       0, 'h'},  // 对应 --help
        {"verbose",  no_argument,       0, 'v'},  // 对应 --verbose
        {"config",   required_argument, 0, 'c'},  // 对应 --config <file>
        {0, 0, 0, 0}  // 数组必须以全0元素结束
    };