getopt 函数是用于解析命令行选项和参数的函数。可以非常方便的在运行程序时添加命令行选项。本篇博客主要介绍getopt_long,它扩展了 getopt 函数的功能,支持长选项(例如以 - - 开头的选项),使用getopt_long 需要包含头文件:
#include <getopt.h>
函数定义:
int getopt_long(int argc, char *const argv[], const char *optstring,
const struct option *long_options, int *option_index);
optstring:一个包含有效短选项字符的字符串,用于指定程序可以接受的短选项及其是否需要参数。与 getopt 中的 optstring 类似。
long_options:一个指向 struct option 数组的指针,用于定义长选项。
option 结构体定义:
struct option
{
const char *name;
/* has_arg can't be an enum because some compilers complain about
type mismatches in all the code that assumes it is an int. */
int has_arg;
int *flag;
int val;
};
name:长选项的名称(例如 “help”)。
has_arg:指定选项是否需要参数:no_argument,required_argument 或者optional_argument
flag:如果非NULL,则当选项被解析时,*flag 被设置为 val,并且 getopt_long 返回 0。
val:如果 flag 为 NULL,则当选项被解析时,getopt_long 函数返回 val。
下面是一个例程:
int main(int argc, char* argv[]) {
int opt;
int option_index = 0;
struct option long_options[] = {
{"help", no_argument, 0, 'h'},
{"generate", no_argument, 0, 'g'},
{"save", required_argument, 0, 's'},
{"load", required_argument, 0, 'l'},
{0, 0, 0, 0} // end
};
const char *optstring = "hgs:l:";
while ((opt = getopt_long(argc, argv, optstring, long_options, &option_index)) != -1) {
switch (opt) {
case 'h':
printf("Usage: %s [options]\n", argv[0]);
printf("-h, --help display this help message\n");
printf("-g, --generate generate file\n");
printf("-s, --save FILE save file\n");
printf("-l, --load FILE load file\n");
exit(0);
break;
case 'g':
generate_file(); /* custom code */
exit(0);
break;
case 's':
save_file(optarg); /* custom code */
exit(0);
break;
case 'l':
load_file(optarg); /* custom code */
printf("load file: %s\n", optarg);
break;
default:
printf("?? getopt returned character code 0%o ??\n", opt);
exit(0);
break;
}
}
/* custom code */
return 0;
getopt_long 按 longopts 数组的顺序解析长选项。也可以解析在optstring 中定义的短选项。
optstring 中每个字符代表一个短选项,并且可以指定该选项是否需要参数:
单个字符:表示一个不带参数的短选项。例如,h 表示选项 -h。
字符后跟冒号 ::表示一个需要参数的短选项。例如,s: 表示选项 -s 需要一个参数(可以是 -s value 或 -svalue)。
双冒号 :::表示一个带有可选参数的短选项。
optarg 是一个全局变量,当解析到一个需要参数的选项时(无论是短选项还是长选项),optarg 将指向该选项的参数值。