源文:http://ckasj.vicp.net/dokuwiki/doku.php/ace:config
此示例演示了ACE_Get_Optint类的基本用法,用来解析类似 program -c -g -a param 这样的程序参数
源码解释
/**
* ARGV_Example.cpp,v 1.3 2004/01/03 13:04:35 jwillemsen Exp
*
* ACE_ARGV examples not in a larger program. Sample code from The ACE
* Programmer's Guide, Copyright 2003 Addison-Wesley. All Rights Reserved.
*/
#include "ace/os_include/os_netdb.h"
#include "ace/OS_NS_string.h"
#include "ace/Log_Msg.h"
// Listing 1 code/ch04
#include "ace/ARGV.h"
#include "ace/Get_Opt.h"
//此示例演示了ACE_Get_Optint类的基本用法,用来解析类似 program -c -g -a param 这样的程序参数
ACE_TMAIN (int argc, ACE_TCHAR *argv[])
{
//'(":f:h:")'类似一个参数解析的模版 字母紧跟着一个冒号':'那就意味着该“参数开关”后期望一个参数
//"f:" 和"h:"说明参数列表必须是 -f parm1 -h parm2的形式
//options[] = "ab:" 则说明参数列表应该是 -a -b parm1类似的形式
static const ACE_TCHAR options[] = ACE_TEXT (":f:h:");
//ACE_Get_Opt会根据指定的参数和模版生产我们需要的参数列表
ACE_Get_Opt cmd_opts (argc, argv, options);
// Listing 1
int option;
ACE_TCHAR config_file[MAXPATHLEN];
ACE_TCHAR hostname[MAXHOSTNAMELEN];
ACE_OS_String::strcpy (config_file, ACE_TEXT ("HAStatus.conf"));
ACE_OS_String::strcpy (hostname, ACE_TEXT ("not set"));
//遍历参数列表并进行读取、解析
while ((option = cmd_opts ()) != EOF)
switch (option) {
case 'f':
ACE_OS_String::strncpy (config_file,
cmd_opts.opt_arg (),
MAXPATHLEN);
break;
case 'h':
ACE_OS_String::strncpy (hostname,
cmd_opts.opt_arg (),
MAXHOSTNAMELEN);
break;
//':'放在"参数模版"的最前面,如果根据模版指示如没有找到期待的参数
//重载的'='操作符会返回':'否则会返回'?'
case ':':
ACE_ERROR_RETURN
((LM_ERROR, ACE_TEXT ("-%c requires an argument/n"),
cmd_opts.opt_opt ()), -1);
default:
ACE_ERROR_RETURN
((LM_ERROR, ACE_TEXT ("Parse error./n")), -1);
}
ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("Config file: %s/n"), config_file));
ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("Hostname: %s/n"), hostname));
return 0;
}