Linux系统下,需要大量的命令行选项,如果自己手动解析他们的话实在是有违软件复用的思想,不过还好,GNU C library留给我们一个解析命令行的接口(X/Open规范),好好使用它可以使你的程序改观不少。
使用getopt_long()需要引入头文件:#include<getopt.h>
现在我们使用一个例子来说明它的使用。
一个应用程序需要如下的短选项和长选项
短选项 长选项 作用
-h --help 输出程序命令行参数说明然后退出
-o filename --output filename 给定输出文件名
-v --version 显示程序当前版本后退出
为了使用getopt_long()函数,我们需要先确定两个结构:
1.一个字符串,包括所需要的短选项字符,如果选项后有参数,字符后加一个":"符号。本例中,这个字符串应该为"ho:v"。(因为-o后面有参数filename,所以字符后面需要加":")。
2. 一个包含长选项字符串的结构体数组,每一个结构体包含4个域,第一个域为长选项字符串,第二个域是一个标识,只能为0或1,分别代表没有选项或有选项。第三个域永远为NULL。第四个选项域为对应的短选项字符串。结构体数组的最后一个元素全部位NULL和0,标识结束。在本例中,它应为以下的样子:
const struct option long_options[] = {
{"help", 0, NULL, 'h'},
{"output", 1, NULL, 'o'},
{"version", 0, NULL, 'v'},
{NULL, 0, NULL, 0}
};
调用时需要把main的两个参数argc和argv以及上述两个数据结构传给getopt_long()函数。
#include <getopt.h>
#include <stdio.h>
#include <stdlib.h>


/**//* The name of this program. */
const char* program_name;


/**//* Prints usage information for this program to STREAM (typically
stdout or stderr), and exit the program with EXIT_CODE. Does not
return. */
void print_usage(FILE* stream, int exit_code)


{
fprintf(stream, "Usage: %s options [ inputfile
]\n",
program_name);
fprintf(stream,
" -h --hlep Display this usage information.\n"
" -o --output filename Write output to file.\n"
" -v --verbose Print verbose message.\n");
exit (exit_code);
}


/**//* Main program entry point. ARGC contains number of argument list
elements; ARGV is an array of pointers to them. */

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


{
int next_option;


/**//* A string listing valid short options letters. */
const char* const short_options = "ho:v";

/**//* An array describing valid long options. */

const struct option long_options[] =
{

{"help", 0, NULL, 'h'},

{"output", 1, NULL, 'o'},

{"verbose", 0, NULL, 'v'},

{NULL, 0, NULL, 0} /**//* Required at end of array. */
};


/**//* The name of the file to receive program output, or NULL for
* standard output.
*/
const char* output_filename = NULL;


/**//* Whether to display verbose messages. */
int verbose = 0;


/**//* Remember the name of the program, to incorporate in messages.
* The name is stored in argv[0].
*/
program_name = argv[0];


do
{
next_option = getopt_long (argc, argv, short_options,
long_options, NULL);
switch (next_option)

{

case 'h': /**//* -h or --help */

/**//* User has requested usage information. Print it to
* standard output, and exit with exit code zero
* (normal termination).
*/
print_usage(stdout, 0);


case 'o': /**//* -o or --output */

/**//* This option takes an argument, the name of the
* output file.
*/
output_filename = optarg;
break;


case 'v': /**//* -v or --verbose */
verbose = 1;
break;


case '?': /**//* The user specified an invalid option. */

/**//* Print usage information to standard error, and exit
* with exit code one (indicating abnormal
* termination).
*/
print_usage(stderr, 1);


case -1: /**//* Done with options. */
break;


default: /**//* Something else: unexpected. */
abort();
}
}
while (next_option != -1);


/**//* Done with options. OPTINO points to first nonoption argument.
* FOr demonstration purposes, print them if the verbose option
* was specified.
*/
if (verbose)

{
int i;
for (i = optind; i < argc; ++i)
printf("Argument: %s\n", argv[i]);
}


/**//* The main program goes here. */
return 0;
}