在Linux中,一切皆文件,所有可执行程序都可以通过命令行启动。程序启动时,通常会带上各种参数来控制程序的行为。因此,解析命令行参数通常是可执行程序的第一步。下面介绍一下常用的命令行参数解析函数——getopt_long。我们先来看看命令行参数。命令行参数可以分为两类,一类是短选项,一类是长选项。在命令行中,“-”表示短选项,“--”表示长选项。例如,在Linux中最常用的ls命令中,“-a、-A、-b”都是短选项,而它们对应的长选项是“--all、--almost-all、--escape”。他们还可以选择添加其他参数,例如“--block-size=SIZE”。getopt_long支持命令行解析长短选项,函数在头文件中。其函数定义为:intgetopt_long(intargc,char*constargv[],constchar*optstring,conststructoption*longopts,int*longindex);接下来介绍它的参数和返回值。argc和argv同main函数的两个参数。optstring:表示一个简短的选项字符串。形式如“a”,表示程序支持的短命令行选项有-a、-b、-c、-d,冒号的含义如下:1.只有一个字符没有冒号-它仅表示选项,例如-c。2.一个字符后跟一个冒号-表示该选项后跟一个参数,如-a100。3.一个字符后跟两个冒号-表示该选项后有一个可选参数,即参数是可选的。如果有参数,选项和参数之间不能有空格,比如-b123。longopts:多头期权结构。其结构及解释如下:structoption{constchar*name;//表示长选项名inthas_arg;//表示选项后是否带参数。有3个值。//no_argument(或0),参数后面不跟参数值。//required_argument(or1),参数输入格式为:--parametervalue或--parameter=value。//optional_argument(或2),参数输入格式只能是:--parameter=value。int*flag;//用来判断函数的返回值。如果flag为null,函数将返回与option匹配的val值,如果flag不为null,函数将返回0,flag指针参数将指向与option匹配的val值。整数值;//结合flag决定返回值}longindex:如果longindex不为null,指向的变量会记录longopts的下标值。返回值:如果找到短选项,则返回短选项对应的字符。如果找到long选项并且flag为null,则返回val,如果flag不为null,则返回0。如果出现错误,如:选项无法识别或必须添加参数的选项缺少参数,返回“?”,如果在optstring中设置第一个字符为“:”,则缺少的参数返回“:”。“?”当缩写的长选项导致歧义或不需要的选项强加参数时返回。返回-1表示所有选项处理完成。如果输入的argv[]中包含独立的“--”字符串,则解析后返回-1,并停止解析options。还有一些全局变量需要了解:optarg(指针):表示当前选项对应的参数值。optind:表示argv中下一个要处理的参数的下标值。opterr:如果opterr=0,错误将不会输出到标准输出流。当opterr非零时,将错误输出到屏幕。optopt:指示错误或无法识别的选项。注意:longopts的最后一个元素必须全0填充,否则会报段错误。空头期权中的每个选项都是唯一的。如果缩写了长选项,它也需要是唯一的。下面是一个简单的例子:/*程序运行参数结构*/structInputArgs{std::stringuser_id;std::string用户名;std::字符串密码;voidprintArgs();boolcheckArgs(){if(user_id.empty()){返回假;}if(user_name.empty()){returnfalse;}if(pwd.empty()){返回false;}返回真;}};InputArgsg_input_arg_info;voidInputArgs::printArgs(){printf("ARGS:--=%s\n",userId.c_str());printf("--userName=%s\n",user_name.c_str());printf("--pwd=%s\n",pwd.c_str());}/*参数解析*/constchar*short_options="i:n:p:";structoptionlong_options[]={{"userId",required_argument,NULL,'i'},{"userName",required_argument,NULL,'n'},{"pwd",required_argument,NULL,'p'},{0,0,0,0},};voidprint_usage(){printf("DESCRIPTION\n");printf("--userId,-i\n");printf("--用户名,-n\n");printf("--pwd,-p\n");}voidprint_arg(intargc,char*argv[]){对于(inti=0;i