描述
一些利用gflag的小代码
参考文章https://www.cnblogs.com/myyan/p/4798679.html
代码
gflags::ParseCommandLineFlags(&argc, &argv, false)用于解析命令行参数,false在解析后不会删除argv的值,true会删除。
总的代码如下
#include <iostream>
#include <gflags/gflags.h>
DEFINE_bool(value_bool, true, "bool value");
DEFINE_int32(value_int32, 2147483647, "int32 value");
DEFINE_int64(value_int64, 9223372036854775807, "int64 value");
DEFINE_uint64(value_uint64, 18446744073709551615, "uint64 value");
DEFINE_double(value_double, 1.1, "double value");
DEFINE_string(value_string, "../path", "string value");
int main(int argc, char** argv)
{
for (int i = 0; i < argc; i++) {
printf("argv[%d] = %s\n", i, argv[i]);
}
printf("---------------here--------------\n");
gflags::SetVersionString("1.0.0.0");
gflags::SetUsageMessage("Usage : ./demo ");
gflags::ParseCommandLineFlags(&argc, &argv, false);
for (int i = 0; i < argc; i++) {
printf("argv[%d] = %s\n", i, argv[i]);
}
printf("---------------there--------------\n");
std::cout << "value_bool = " << FLAGS_value_bool << std::endl;
std::cout << "value_int32 = " << FLAGS_value_int32 << std::endl;
std::cout << "value_int64 = " << FLAGS_value_int64 << std::endl;
std::cout << "value_uint64 = " << FLAGS_value_uint64 << std::endl;
std::cout << "value_double = " << FLAGS_value_double << std::endl;
std::cout << "value_string = " << FLAGS_value_string << std::endl;
gflags::ShutDownCommandLineFlags();
return 0;
}
CMakeLists.txt
find_package(Gflags REQUIRED)
target_link_libraries(try gflags)
运行
如果你输入超过int64等类型的定义值,会报错
./try --value_bool=false --value_int32=2147483648 --value_int64=9223372036854775809 --value_uint64=18446744073709551616 --value_double=2.2 --value_string=../a.txt
结果提示
argv[0] = ./try
argv[1] = --value_bool=false
argv[2] = --value_int32=2147483648
argv[3] = --value_int64=9223372036854775809
argv[4] = --value_uint64=18446744073709551616
argv[5] = --value_double=2.2
argv[6] = --value_string=../a.txt
---------------here--------------
ERROR: illegal value '2147483648' specified for int32 flag 'value_int32'
ERROR: illegal value '9223372036854775809' specified for int64 flag 'value_int64'
ERROR: illegal value '18446744073709551616' specified for uint64 flag 'value_uint64'
正确输入参数执行后
./try --value_bool=false --value_int32=2147483647 --value_int64=9223372036854775807 --value_uint64=18446744073709551615 --value_double=2.2 --value_string=../a.txt
会得到正确输入结果
argv[0] = ./try
argv[1] = --value_bool=false
argv[2] = --value_int32=2147483647
argv[3] = --value_int64=9223372036854775807
argv[4] = --value_uint64=18446744073709551615
argv[5] = --value_double=2.2
argv[6] = --value_string=../a.txt
---------------here--------------
argv[0] = ./try
argv[1] = --value_bool=false
argv[2] = --value_int32=2147483647
argv[3] = --value_int64=9223372036854775807
argv[4] = --value_uint64=18446744073709551615
argv[5] = --value_double=2.2
argv[6] = --value_string=../a.txt
---------------there--------------
value_bool = 0
value_int32 = 2147483647
value_int64 = 9223372036854775807
value_uint64 = 18446744073709551615
value_double = 2.2
value_string = ../a.txt
参数验证
gflags使用RegisterFlagValidator用于参数验证的一个例子
static bool ValidatePort(const char* flagname, gflags::int32 value) {
if (value >= 36800 && value <= 36888) {
printf("param(%s) = (%d) is valid!\n", flagname, value);
return true;
}
printf("param(%s) = (%d) is invalid!\n", flagname, value);
return false;
}
DEFINE_int32(port, 36810, "program listen port");
static const bool validPort = gflags::RegisterFlagValidator(&FLAGS_port, &ValidatePort);
当然,我们仍然可以自己写的if-else来进行检查,我一般还是这样做的