c++ Google gflags

gflags 是一个 C++ 库,用于解析命令行参数。安装步骤:

$ git clone https://github.com/gflags/gflags.git
$ cd gflags
$ mkdir build-dir
$ cd build-dir
$ cmake ..
$ make
$ sudo make install

CMakeListsx.txt使用

find_package (gflags REQUIRED)
include_directories (${gflags_INCLUDE_DIR})

add_executable (main main.cpp)
target_link_libraries (main gflags)

使用方法

  • 定义一个命令行 flag,port,它的类型是gflags::int32,默认值是8080。除了int32之外,gflags 还支持bool、int64、uint64、double和string类型。
DEFINE_string(变量名,默认值,描述);
DEFINE_int32(port, 8080, "What port to listen on");
  • 在main函数加入如下解析命令行参数,一般都放在 main 开始位置
gflags::ParseCommandLineFlags(&argc, &argv, true);
  • 访问参数
    使用FLAGS_ + DEFINE_string 中申明的变量名即可调用
std::cout << "m is: " << FLAGS_m << endl;

命令行运行

./main --port=5800 --debug

示例:

#include <iostream>
#include <gflags/gflags.h>
static bool ValidatePort(const char* flagname, gflags::int32 value)
{
    if (value > 0 && value < 32768)
    {
        return true;
    }
    return false;
}
DEFINE_int32(port, 8080, "What port to listen on");
DEFINE_validator(port, &ValidatePort);
DEFINE_bool(debug, false, "Turn on the debug mode");

int main(int argc, char *argv[])
{
    gflags::ParseCommandLineFlags(&argc, &argv, true);
    std::cout << "port = " << FLAGS_port << std::endl;
    std::cout << "debug = " << std::boolalpha << FLAGS_debug << std::endl;
    return 0;
}
  • 跨文件调用
    访问在另一个文件定义的 gflags 变量,使用 DECLARE_,它的作用就相当于用 extern 声明变量。
    例如,在foo.cc 定义了一个 gflags 变量 DEFINE_string(name, ‘bob’, ‘’),在 foo.h 中声明 DECLARE_string(name),然后在使用该变量的文件中 include “foo.h” 就可以。

  • 帮助和版本信息
    SetVersionString() 和 SetUsageMessage() 一定要在 ParseCommandLineFlags() 之前设定。

gflags::SetVersionString("1.0.0");//设置版本,./gflag_test --version的时候会显示

gflags::SetUsageMessage("Usage: ./gflags_test");//帮助信息设置
  • 参数少显示帮助信息
if(argc<3)
    gflags::ShowUsageWithFlagsRestrict(argv[0], "gflags_test");//注意:第二个参数是限制的model_name

示例:

#include <gflags/gflags.h>
#include <iostream>
#include <string>

using namespace std;

DEFINE_string(ip, "127.0.0.1", "ip address");
DEFINE_int32(port, 8080, "port");
DEFINE_double(retry_ratio,0.5,"retry connect");
DEFINE_bool(daemon,false,"daemon flag");

int main(int argc,char* argv[]) {  

    gflags::SetVersionString("1.0.0");
    string usage_str = "Usage: ";
    usage_str+=argv[0];
    gflags::SetUsageMessage(usage_str);
    if(argc<2){
        gflags::ShowUsageWithFlagsRestrict(argv[0], "gflags_test");
        return 0;
    }
    gflags::ParseCommandLineFlags(&argc, &argv, true);
    cout<<"ip:"<<FLAGS_ip<<endl;
    cout<<"port:"<<FLAGS_port<<endl;
    cout<<"retry_ratio:"<<FLAGS_retry_ratio<<endl;
    cout<<"daemon:"<<FLAGS_daemon<<endl;
    return 0;  
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值