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

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值