const 发布的文章

“const”

gflags 定义变量供多个文件使用
使用DECLARE_xxx与DEFINE_xxx方式,DECLARE_xxx在头文件中,DEFINE_xxx在源文件中。
示例:file flags.h

#ifndef FLAGS_H
#define FLAGS_H
#include "gflags/gflags.h"
#include <string>
using std::string;
DECLARE_int32(int32_var);
DECLARE_int64(int64_var);
DECLARE_bool(bool_var);
DECLARE_double(double_var);
DECLARE_uint32(uint32_var);
DECLARE_uint64(uint64_var);
DECLARE_string(string_var);
#endif 

示例:file flags.cpp

#include "flags.h"
DEFINE_int32(int32_var, 0, "int32 变量示例,默认为0");
DEFINE_int64(int64_var, 0, "int64 变量示例,默认为0");
DEFINE_bool(bool_var, true, "bool 变量示例,默认为true");
DEFINE_double(double_var, 0.0, "double 变量示例,默认为0.0");
DEFINE_uint32(uint32_var, 0, "uint32 变量示例,默认为0");
DEFINE_uint64(uint64_var, 0, "uint64 变量示例,默认为0");
DEFINE_string(string_var, "", "string 变量示例,默认为空");

示例使用:

#include "bits/stdc++.h"
#include <gflags/gflags.h>
#include "flags.h"
using namespace std;
int main(int argc, char* argv[])
{
    google::SetVersionString("V1.0.0@const.net.cn");
    google::SetUsageMessage("-help ");
    google::ParseCommandLineFlags(&argc, &argv, true);
    std::cout << FLAGS_string_var<< std::endl;
    std::cout << FLAGS_int32_var<< std::endl;
    std::cout << FLAGS_bool_var<< std::endl;
    return 0;
}

运行结果:

./test_gflags -help
Flags from flags.cpp:
    -bool_var (bool 变量示例,默认为true) type: bool default: true
    -double_var (double 变量示例,默认为0.0) type: double default: 0
    -int32_var (int32 变量示例,默认为0) type: int32 default: 0
    -int64_var (int64 变量示例,默认为0) type: int64 default: 0
    -string_var (string 变量示例,默认为空) type: string default: ""
    -uint32_var (uint32 变量示例,默认为0) type: uint32 default: 0
    -uint64_var (uint64 变量示例,默认为0) type: uint64 default: 0

在gflags的参数中,可以使用--flagfile指定flag的配置文件,而不需要在程序运行过程中指定参数。当flagfile为空时,程序指定默认值方法。以解析文件中的flags
主要代码:

gflags::SetVersionString("1.0.0");
    google::ParseCommandLineFlags(&argc, &argv, true);
    if (FLAGS_flagfile.empty()) 
    {
        google::SetCommandLineOption("flagfile", "/home/const/flag.cfg");
        cout<<"FLAGS_flagfile is empty. use default flag file.",<<endl;
    }

google::SetCommandLineOption("flagfile", "gflags_sample.flags");
FLAGS_flagfile更新后,会自动重新读取该文件并更新文件里的gflags。

该方法可以起到reload的效果,后者覆盖前者,如果后面调用的方法没有定义某flag,那么不影响前面方法已经解析出的value,类似于merge的效果。

gflags提供了一个检查传入flag值是否有效的功能,只要定义检测函数,并且注册就可以了。
检测函数以及注册方式的例子:

static bool ValidatePort(const char* flagname, int32 value) {
if (value > 0 && value < 32768) // value is ok

 return true;

printf("Invalid value for --%s: %dn", flagname, (int)value);
return false;
}
DEFINE_int32(port, 0, "What port to listen on");
static const bool port_dummy = RegisterFlagValidator(&FLAGS_port, &ValidatePort);
如果注册成功,regist函数返回值为ture。否则返回false,注册失败一般是一下两种原因:

第一个参数不是flag
该flag已经注册过

使用GetCommandLineFlagInfo即可例如判断portno是否设置:

#include "bits/stdc++.h"
#include <gflags/gflags.h>
#include "flags.h"

using namespace std;

DEFINE_int32(portno, 0, "portno,默认为0");

int main(int argc, char* argv[])
{
    google::SetVersionString("V1.0.0@const.net.cn");
    google::SetUsageMessage("-help ");
    google::ParseCommandLineFlags(&argc, &argv, true);

    google::CommandLineFlagInfo info;
    if (GetCommandLineFlagInfo("portno", &info) && info.is_default) 
    {
        std::cout << "portno is not set." << std::endl;
    } 
    else 
    {
        std::cout << "portno is set." << FLAGS_portno <<std::endl;
    }


    std::cout << FLAGS_string_var<< std::endl;
    std::cout << FLAGS_int32_var<< std::endl;
    std::cout << FLAGS_bool_var<< std::endl;
    return 0;
}

./test_gflags -portno=11
portno is set.11

0
1

extern void GetAllFlags(std::vector<CommandLineFlagInfo>* OUTPUT)接口

示例代码:

#include "bits/stdc++.h"
#include <gflags/gflags.h>
#include "flags.h"

using namespace std;

DEFINE_int32(portno, 0, "portno,默认为0");

int main(int argc, char* argv[])
{
    google::SetVersionString("V1.0.0@const.net.cn");
    google::SetUsageMessage("-help ");
    google::ParseCommandLineFlags(&argc, &argv, true);

    std::vector<google::CommandLineFlagInfo> OUTPUT;
    GetAllFlags(&OUTPUT);
    for(auto i=0;i<OUTPUT.size();i++)
    {
        cout<<OUTPUT[i].name<<"="<<OUTPUT[i].current_value<<endl;
    }
    return 0;
}

 ./test_gflags -portno=11

flagfile=
fromenv=
tryfromenv=
undefok=
tab_completion_columns=80
tab_completion_word=
help=false
helpfull=false
helpmatch=
helpon=
helppackage=false
helpshort=false
helpxml=false
version=false
bool_var=true
double_var=0
int32_var=0
int64_var=0
string_var=
uint32_var=0
uint64_var=0
portno=11