ACE处理命令行参数:ACE_Get_OPt

来源:互联网 发布:linux nfs是什么 编辑:程序博客网 时间:2024/05/19 11:44

ACE提供了ACE_Get_Opt类来处理命令行参数选项:这个类是一个迭代器,用于解析按照自然数方式计数的参数向量;它包装了POSIX的getotp()函数的功能,但是与getopt()函数不同,ACE_Get_Opt类的每个实例都维护有自己的状态,所以它是可重入的;此外,ACE_Get_Opt类比getopt()函数更易于使用,因为选项定义字符串和参数向量只需要一次性地传递给ACE_Get_OPt类的构造函数,而不需要在每次调用迭代器时都进行传递;

ACE_Get_Opt;类可以解析两种命令行选项:

A:简单的单字符单选项,以单短划线("-")开头;

B:长选项,以双短划线("--")开头;比如--prefix;

ACE_Get_Opt类的实例使用operator()来迭代命令行选项;如果遇到单选项字符时,它直接返回该字符;如果遇到长选项时,它返回与该长选项等价的短选项字符;选项的参数通过opt_arg()方法返回;如果命令行所有选项都处理完毕,operator()返回EOF;

在处理argv数组中的元素时,ACE_Get_Opt类的实例会记住它在参数向量中的当前位置.当它发现需要参数的选项时,就会按照需要从当前的argv元素中的剩余字符中、或下一个argv元素中取出该选项的参数.但是,可选参数必须与选项字符处在同一个元素中.如果缺少必需的参数,这时的行为取决于短选项定义字符串的第一个字符.如果这个字符是':',那么operator()就会返回字符':';否则返回字符'?';

没有参数的短选项可以在开头的'-'之后被归结在一起,但是在这种情况下,只有组中最后一个选项可以有参数.如果operator()不认识这个短选项,那么就直接返回字符'?';

由于短选项被定义为整数,在正常情况下,没有有意义的等价短选项的长选项可以指定一个非字母与数字的值,作为相应的短选项.这些值不能出现在参数列表中,也不能出现在短选项定义串中,但是可以被返回.如:

cmd_opts.long_option(ACE_TEXT("cool_option"));

这条语句增加一个长选项--cool_option,并规定,如果命令行上指定了长选项--cool_option,那么operator()就返回0.

cmd_opts.long_option(ACE_TEXT("the_answer"),42);

这条语句增加了一个长选项--the_answer,并规定,如果operator()在命令行上遇到长选项--the_anwser,就要返回整数值42;

如果operator()在命令行上遇到内容为"--"的元素,那就表明选项区域已经结束,operator()就会返回EOF.如果opt_ind()返回的整数值小于命令行参数的数目argc,那就表明还有一些元素没有被解析;

改变ACE_Get_Opt的行为:

通过改变ACE_Get_Opt类的构造函数的默认值,就可以访问它的扩展功能.ACE_Get_Opt类的构造函数原型如下:

ACE_Get_Opt(int argc, ACE_TCHAR** argv, constACE_TCHAR* optstring, int skip_args = 1, int report_errors = 0, intordering = PERMUTE_ARGS, int long_only = 0);

参数skip_args指定从命令行中的那个参数位置处开始迭代解析.默认为1,表示从元素argv[1]处开始迭代解析,通常argv[0]中存放的是程序名称;

例子:

  1. #include "ace/Get_Opt.h"  
  2. #include "ace/Log_Msg.h"  
  3.  
  4. int ACE_TMAIN(int argc, ACE_TCHAR** argv)  
  5. {  
  6.  const ACE_TCHAR options[] = "f:F:s:S:vVhHdD";  
  7.  int opt = 0;  
  8.  ACE_Get_Opt cmd_opts(argc, argv, options);  
  9.  
  10.  cmd_opts.long_option(ACE_TEXT("config"), 'f', ACE_Get_Opt::ARG_REQUIRED);  
  11.  cmd_opts.long_option(ACE_TEXT("segment"), 's', ACE_Get_Opt::ARG_REQUIRED);  
  12.  
  13.  cmd_opts.long_option(ACE_TEXT("CONFIG"), 'f', ACE_Get_Opt::ARG_REQUIRED);  
  14.  cmd_opts.long_option(ACE_TEXT("SEGMENT"), 's', ACE_Get_Opt::ARG_REQUIRED);  
  15.  
  16.  while((opt = cmd_opts()) != EOF)  
  17.  {  
  18.   switch(opt)  
  19.   {  
  20.    case 'f':  
  21.    case 'F':  
  22.     {  
  23.      ACE_DEBUG( (LM_INFO, ACE_TEXT("File: -fF[%d]: %s/n"),
  24.  cmd_opts.opt_ind(), cmd_opts.opt_arg()) );  
  25.     }  
  26.     break;  
  27.  
  28.    case 's':  
  29.    case 'S':  
  30.     {  
  31.      ACE_DEBUG( (LM_INFO, ACE_TEXT("Segment: -sS[%d]: %s/n"),
  32.  cmd_opts.opt_ind(), cmd_opts.opt_arg()) );  
  33.     }  
  34.     break;  
  35.  
  36.    case 'v':  
  37.    case 'V':  
  38.     {  
  39.      ACE_DEBUG( (LM_INFO, ACE_TEXT("Version: -vV[%d]: %s/n"),
  40.  cmd_opts.opt_ind(), cmd_opts.opt_arg()) );  
  41.     }  
  42.     break;  
  43.  
  44.    case 'h':  
  45.    case 'H':  
  46.     {  
  47.      ACE_DEBUG( (LM_INFO, ACE_TEXT("Help: -hH[%d]: %s/n"),
  48.  cmd_opts.opt_ind(), cmd_opts.opt_arg()) );  
  49.     }  
  50.     break;  
  51.  
  52.    default:  
  53.     {  
  54.      ACE_DEBUG( (LM_INFO, ACE_TEXT("UnKnown option[%d]: %s/n"),
  55.  cmd_opts.opt_ind(), cmd_opts.opt_arg()) );  
  56.     }  
  57.   }  
  58.  }  
  59.  
  60.  return 0;  
  61. }