控制台工具常需解析複雜參數(短選項 -s、長選項 --server、帶參數選項、選項排序等),手寫解析易出錯且難維護。ACE_Get_Opt 提供標準化、健壯的解決方案。
ACE_Get_Opt(int argc, ACE_TCHAR **argv,
const ACE_TCHAR *optstring = "", // 短選項定義
int skip_args = 1, // 跳過 argv[0]
int report_errors = 0, // 遇到未知選項是否報錯
int ordering = PERMUTE_ARGS, // 選項/非選項處理順序
int long_only = 0); // 是否允許單破折號長選項
optstring 規則:
s:單純選項,無參數s::選項需帶參數(參數可在同一或下一個 argv)s:::選項參數可選(必須在同一 argv)+ → REQUIRE_ORDER,- → RETURN_IN_ORDER,: → 缺參數時回傳 : 而非 ?long_option()
// 註冊長選項對應短選項
int long_option(const ACE_TCHAR *name, int short_option,
OPTION_ARG_MODE has_arg = NO_ARG);
// 解析過程中取得觸發的長選項名稱
const ACE_TCHAR *long_option(void) const;
int operator()():回傳解析到的短選項字元、0(長選項)、EOF(-1, 結束)、?/:(錯誤)、'1'(非選項參數)ACE_TCHAR *opt_arg():取得目前選項的參數值int opt_ind():下一個待處理 argv 索引
#include "ace/Get_Opt.h"
#include
using namespace std;
int _tmain(int argc, _TCHAR* argv[]) {
ACE_Get_Opt opt(argc, argv, "s:u:p:", 1, 0); // 三個短選項皆需參數
// 註冊長選項
if (opt.long_option("server", 's', ACE_Get_Opt::ARG_REQUIRED) == -1)
cout << "server option add failed\n";
if (opt.long_option("user", 'u', ACE_Get_Opt::ARG_REQUIRED) == -1)
cout << "user option add failed\n";
if (opt.long_option("pwd", 'p', ACE_Get_Opt::ARG_REQUIRED) == -1)
cout << "pwd option add failed\n";
// 解析迴圈
for (int arg = 0; (arg = opt()) != -1; ) {
switch (arg) {
case 's': cout << "server is " << opt.opt_arg() << endl; break;
case 'u': cout << "user is " << opt.opt_arg() << endl; break;
case 'p': cout << "pwd is " << opt.opt_arg() << endl; break;
case 0: // 長選項
if (_stricmp(opt.long_option(), "server") == 0)
cout << "long option server is " << opt.opt_arg() << endl;
break;
default: break;
}
}
// 使用說明
if (opt.opt_ind() + 2 < argc) {
cout << "Usage: GetOptTest.exe [options]\n"
<< "\t-s, --server server address\n"
<< "\t-u, --user user name\n"
<< "\t-p, --pwd password\n";
}
return 0;
}
命令列: -s 127.0.0.1 --server 192.168.0.1 -u hbccdf -p pwdfortest

短/長選項混用、參數正確解析、未知選項自動報錯(report_errors=1 時)。