或许是我见得少,反正这是目前遇到最好命令行参数例子,下面给出源码及简单介绍:
第一部分:主要是声明一个结构体,将解析到的参数放在结构体中,同时还给出一个默认参数;
16 #include <getopt.h>
	 61 typedef struct Args {
	 62     VideoStd_Type  videoStd;
	 63     Char          *videoStdString;
	 64     Sound_Input    soundInput;
	 65     Capture_Input  videoInput;
	 66     Char          *speechFile;
	 67     Char          *videoFile;
	 68     Codec         *speechEncoder;
	 69     Codec         *videoEncoder;
	 70     Int32          imageWidth;
	 71     Int32          imageHeight;
	 72     Int            videoBitRate;
	 73     Int            keyboard;
	 74     Int            time;
	 75     Int            osd;
	 76     Int            interface;
	 77 } Args;
	 78
	 79 #define DEFAULT_ARGS \
	 80     { VideoStd_D1_NTSC, "D1 NTSC", Sound_Input_MIC, Capture_Input_COMPOSITE, \
	 81       NULL, NULL, NULL, NULL, 0, 0, -1, FALSE, FOREVER, FALSE, FALSE }
	
	第二部分:核心部分,标准的信息打印,和命令行参数解析函数
	118 /**********************************
	119  * usage
	120  **********************************/
	121 static void usage(void)
	122 {
	123     fprintf(stderr, "Usage: encode [options]\n\n"
	124       "Options:\n"
	125       "-s | --speechfile       Speech file to record to\n"
	126       "-v | --videofile        Video file to record to\n"
	127       "-y | --display_standard Video standard to use for display (see below).\n"
	128       "-r | --resolution       Video resolution ('width'x'height')\n"
	129       "                        [video standard default]\n"
	130       "-b | --videobitrate     Bit rate to encode video at [variable]\n"
	131       "-x | --svideo           Use s-video instead of composite video \n"
	132       "                        input [off]\n"
	133       "-l | --linein           Use linein for encoding sound instead of mic \n"
	134       "                        [off]\n"
	135       "-k | --keyboard         Enable keyboard interface [off]\n"
	136       "-t | --time             Number of seconds to run the demo [infinite]\n"
	137       "-o | --osd              Show demo data on an OSD [off]\n"
	138       "-i | --interface        Launch the demo interface when exiting [off]\n"
	139       "-h | --help             Print this message\n\n"
	140       "Video standards available:\n"
	141       "\t1\tD1 @ 30 fps (NTSC) [Default]\n"
	142       "\t2\tD1 @ 25 fps (PAL)\n"
	143       "\t3\t720P @ 60 fps\n"
	144       "\t4\t720P @ 50 fps\n"
	145       "\t5\t1080I @ 30 fps [Not supported for DM365]\n"
	146       "\t6\t1080I @ 25 fps [Not supported for DM365]\n"
	147       "You must supply at least a video or a speech file or both\n"
	148       "with appropriate extensions for the file formats.\n\n");
	149 }
	150
核心部分:参数解析的时候分短选项和长选项,那么shortOptions与longOptions就对应与两者,
其中shortOptions选项中如果加了“:”冒号,那么就需要带参数,而longOptions中通过“ required_argument”
与“ no_argument“来进行区分,最后把这两个参数传递给getopt_long函数就能逐一返回一个个选项,再根据选项
得到对应的参数,并将其存放在结构体中,整个过程就这样了;
	151 /*******************************
	152  * parseArgs
	153  ******************************/
	154 static Void parseArgs(Int argc, Char *argv[], Args *argsp)
	155 {
	156     const Char shortOptions[] = "s:v:y:r:b:xlkt:oih";
	157     const struct option longOptions[] = {
	158         {"speechfile",       required_argument, NULL, 's'},
	159         {"videofile",        required_argument, NULL, 'v'},
	160         {"display_standard", required_argument, NULL, 'y'},
	161         {"resolution",       required_argument, NULL, 'r'},
	162         {"videobitrate",     required_argument, NULL, 'b'},
	163         {"svideo",           no_argument,       NULL, 'x'},
	164         {"linein",           no_argument,       NULL, 'l'},
	165         {"keyboard",         no_argument,       NULL, 'k'},
	166         {"time",             required_argument, NULL, 't'},
	167         {"osd",              no_argument,       NULL, 'o'},
	168         {"interface",        no_argument,       NULL, 'i'},
	169         {"help",             no_argument,       NULL, 'h'},
	170         {0, 0, 0, 0}
	171     };
	172
	173     Int     index;
	174     Int     c;
	175     Char    *extension;
	176
	177     for (;;) {
	178         c = getopt_long(argc, argv, shortOptions, longOptions, &index);
	179
	180         if (c == -1) {
	181             break;
	182         }
	183
	184         switch (c) {
	185             case 0:
	186                 break;
	187
	188             case 's':
	189                 extension = rindex(optarg, '.');
	190                 if (extension == NULL) {
	191                     fprintf(stderr, "Speech file without extension: %s\n",
	192                             optarg);
	193                     exit(EXIT_FAILURE);
	194                 }
	195
	196                 argsp->speechEncoder =
	197                     getCodec(extension, engine->speechEncoders);
	198
	199                 if (!argsp->speechEncoder) {
	200                     fprintf(stderr, "Unknown speech file extension: %s\n",
	201                             extension);
	202                     exit(EXIT_FAILURE);
	203                 }
	204                 argsp->speechFile = optarg;
	205
	206                 break;
....
	
	305             case 't':
	306                 argsp->time = atoi(optarg);
	307                 break;
	308
	309             case 'o':
	310                 argsp->osd = TRUE;
	311                 break;
	312
	313             case 'i':
	314                 argsp->interface = TRUE;
	315                 break;
	316
	317             case 'h':
	318                 usage();
	319                 exit(EXIT_SUCCESS);
	320
	321             default:
	322                 usage();
	323                 exit(EXIT_FAILURE);
	324         }
	325     }
	326
	327     if (argsp->videoInput != Capture_Input_SVIDEO) {
	328         if (argsp->videoStd == VideoStd_D1_NTSC || argsp->videoStd == VideoStd_D1_PAL ) {
	329             argsp->videoInput = Capture_Input_COMPOSITE;
	330         } else {
	331             argsp->videoInput = Capture_Input_COMPONENT;
	332         }
	333     }
	334
	335     /* Need at least one file to decode and only one sound file */
	336     if (!argsp->videoFile && !argsp->speechFile) {
	337         usage();
	338         exit(EXIT_FAILURE);
	339     }
340 }
	
	第三部分:主函数调用部分
	388 /********************************
	389  * main
	390  *******************************/
	391 Int main(Int argc, Char *argv[])
	392 {
	393     Args                args                = DEFAULT_ARGS;
	426     /* Parse the arguments given to the app and set the app environment */
	427     parseArgs(argc, argv, &args);
	428 }
注意:头文件为 #include <getopt.h>,man 到的信息如下:
	www@linux:~/abs_guide/chapter3$ man -k getopt_long
	getopt_long (3)      - Parse command-line options
	getopt_long_only (3) - Parse command-line options

