运行时输入: ./a.out -b -d -cfile2 -d ok -a -f 运行结果: the option is b, the optarg is -d the option is c, the optarg is file2 the option is c, the optarg is file2 the option is d, the optarg is (null) the option is a, the optarg is (null) ./a.out: invalid option -- 'f' 命令行选项字符不包括在optstring中或者选项缺少参数! argv[0] is ./a.out argv[1] is -b argv[2] is -d argv[3] is -cfile2 argv[4] is -d argv[5] is -a argv[6] is -f argv[7] is ok
结果分析:第一个扫描到的参数是b,因为在shirt_str中,b后面有一个冒号,所以其后的任何内容getopt都会认为是它的参数,所以这里即使在-b后面输入-d(d也包含在short_str中),getopt也认为它是-b的参数,由于在short_str中c后面有两个冒号,可跟可不跟,可紧跟可以空格隔开,所以紧跟其后的file2成为了它的参数(至于这里为什么会有两次返回,笔者还未深入了解),d后面没有冒号,所以即使-d后面输入了ok,getopt也不把它作为d的参数(the option is d, the optarg is (null)),-a也跟-d一样;对于f,由于short_str中没有f,所以getopt并没有把它作为需要分析参数的选项,所以" ./a.out: invalid option -- 'f' 命令行选项字符不包括在optstring中或者选项缺少参数! ".
函数原型: int getopt_long(int argc, char *const argv[], const char *optstring, const struct option *longopts, int *longindex);
函数中的argc和argv通常直接从main()到两个参数传递而来.optsting是选项参数组成的字符串,和getopt()函数相同的意思.下一个参数是指向数组的指针,这个数组是option结构数组,option结构称为长选项表,其声明如下: struct option { const char *name; int has_arg; int *flag; int val; };
结构中的元素解释如下: const char *name:选项名,前面没有短横线,也就是除过杠的部分 如:"help"、"verbose"之类。 int has_arg:描述长选项是否有选项参数,如果有,是哪种类型的参数,其值见下表:
int *flag:如果该指针为NULL,那么getopt_long返回val字段的值,这个val就是将来要出现在case,选项里的标志,另外一个理解,相当于name在程序判断时重新起了个名字,用这个来判断是否出现了name这个选项; 如果该指针不为NULL,那么会使得它所指向的结构填入val字段的值,同时getopt_long返回0
int val:如果flag是NULL,那么val通常是个字符常量,如果短选项和长选项一致,即-和–后面的选项一致,那么该字符就应该与optstring中出现的这个选项的参数相同;