700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > c++也可以优雅的解析命令行参数

c++也可以优雅的解析命令行参数

时间:2019-07-29 08:16:37

相关推荐

c++也可以优雅的解析命令行参数

上代码:

#pragma once#include <string>#include <sstream>#include <map>#include <functional>#include <inttypes.h>using namespace std;using UsageHandle = std::function<void (void)>;static std::map<string, string> params;namespace robin{int inline parseArgs(int argc, char ** argv, UsageHandle usage){params.clear();for (int i = 1; i < argc; ){string key = argv[i];i++;if (i >= argc){if (usage)usage();break;}string val = argv[i];i++;params.insert(std::make_pair(key, val));}return params.size();}int inline getIntArg(const char * name, int& val, int init_val = 1, int lower = INT_MIN, int upper = INT_MAX){string tmp = params[name];if (!tmp.empty()){val = std::atoi(tmp.c_str());if (val < lower)val = lower;if (val > upper)val = upper;return 1;}else{val = init_val;return 0;}}int inline getInt64Arg(const char * name, int64_t& val, int64_t init_val = 1, int64_t lower = LLONG_MIN, int64_t upper = LLONG_MAX){string tmp = params[name];if (!tmp.empty()){val = std::atoll(tmp.c_str());if (val < lower)val = lower;if (val > upper)val = upper;return 1;}else{val = init_val;return 0;}}int inline getStringArg(const char * name, string & val, const char * init_val){val = params[name];if (val.empty()){val = init_val;return 0;}return 1;}}// endof namespace robin

使用方式:

void usage(){printf("usage: testxxxx.exe [-n PacketsPerThread] [-s Speed] [-t nThreads]\n");}int main(int argc, char ** argv){int nThreads;int nSpeed;int64_t nPackets;int ret = parseArgs(argc, argv, usage);ret = getIntArg("-t", nThreads, 2, 1, 20);ret = getIntArg("-s", nSpeed, 1000, 1, 100000);ret = getInt64Arg("-n", nPackets, 10000, 1000, 10000 * 10000 * 100);testLog(nThreads, nSpeed, nPackets);return 0;}

命令行为

.\testFnlog.exe -s 2 -n 100000 -t 3

或者在vs 属性,调试,命令行参数中输入-s 2 -n 100000 -t 3

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。