典型的 boost program_options的用法如下:
#include <boost/program_options.hpp> using namespace boost::program_options; using namespace std; int main(int argc, char* argv[]) // 需要命令行參數 { int intValue; options_description opts("Mysql performance options"); //增加兩個程序選項 opts.add_options() ("help,h", "help message") ("int", value<string>(&intValue)->default_value(1), "a int value") variables_map vm; // 選項存儲map容器 store(parse_command_line(argc, argv, opts), vm); //解析參數並存儲到vm中 notify(vm); cout << filename << endl; }
假設編譯出的二進制文件為 test,運行 ./test --int 5。如果這時候想傳入參數-5,寫法應該是 ./test --int -5。由於-5與短參數格式難以分辨(-5也是短參數的格式),這時候程序依舊能夠編譯通過,但是運行的時候會出現參數使用錯誤。為了支持值為負數的參數,我們可以禁用短參數。具體做飯為將store()函數的調用改為
store(parse_command_line(argc, argv, opts,
po::command_line_style::unix_style ^ po::command_line_style::allow_short),
vm);
program_options的默認風格為unix_style, 通過 program_options官方文檔 可以看到 unix_style是幾種 style與的結果,我們只要使用異或的方式就可以把其中某種style去掉。
enum style_t { allow_long = 1, allow_short = allow_long << 1, allow_dash_for_short = allow_short << 1, allow_slash_for_short = allow_dash_for_short << 1, long_allow_adjacent = allow_slash_for_short << 1, long_allow_next = long_allow_adjacent << 1, short_allow_adjacent = long_allow_next << 1, short_allow_next = short_allow_adjacent << 1, allow_sticky = short_allow_next << 1, allow_guessing = allow_sticky << 1, case_insensitive = allow_guessing << 1, allow_long_disguise = case_insensitive << 1, unix_style = (allow_short | short_allow_adjacent | short_allow_next | allow_long | long_allow_adjacent | long_allow_next | allow_sticky | allow_guessing | allow_dash_for_short), default_style = unix_style };
現在重新編譯運行程序,運行 ./test --int -5 就可以正確輸出 -5了。