• 谷歌的gflags(ZZ)


    http://liuxun.org/blog/gu-ge-de-gflags/

    Google gflags官方文档:http://google-gflags.googlecode.com/svn/trunk/doc/gflags.html

    大家一定用过也写过很多的命令程序,有一类命令行程序是形如这样的“cmd –arg1=arg –args=arg”,要做到这点一种方法是自己写个程序去解析这种命令行形式。

    但其实可以更简单,更高效,更安全,推荐使用谷歌的gflags。 gflags可以在google code上下载,项目主页为http://code.google.com/p/google-gflags/。下载安装都跟普通的linux程序差不多,当然windows下也应该是可以使用的。

    用起来也很简单,首先是包含gflags.h头文件,然后在main方法中调用google::ParseCommandLineFlags(&argc, &argv, true),这样就可以解析到命令行传递过来的参数。

    在程序中定义参数可以用到DEFINE_开头的宏,比如你要定义个bool比变量is_run,可以使用如下语句:

    1
    
    DEFINE_bool(is_run, false, “is run”);

    定义了一个bool变量,默认值是false,最后一个参数“is run”是对这个变量的描述。

    定义字符串用DEFINE_string,定义int用DEFINE_int32,还有DEFINE_int64和DEFINE_uint64。

    如何在程序中使用这些变量呢?FLAGS_is_run这样的格式就可了。到要是在定义的其他文件中使用这些参数呢?那需要用到DECLARE_宏了,想到于声明了一个extern变量。

    那在命令行上如何使用呢?一开始就说过了。还拿那个is_run的例子,可以传递参数—is_run=true。

    基本用法:
    1.首先要定义变量,定义方法如下:
    参数依次是: 变量名, 默认值,说明

    DEFINE_bool(test_bool, false, “tests bool-ness”);
    DEFINE_int32(test_int32, -1, “”);
    DEFINE_int64(test_int64, -2, “”);
    DEFINE_uint64(test_uint64, 2, “”);
    DEFINE_double(test_double, -1.0, “”);
    DEFINE_string(test_string, “initial”, “”);
    2. 定义后就可以使用了,使用方法
    FLAGS_test_bool 当作bool值用
    FLAGS_test_int32 当作int32值用
    ……
    当然,这个变量还可以赋值
    FLAGS_test_int32 = 100;

    3.  如何在命令行传入非默认值
    a. 首先在程序内解析命令行参数
    google::ParseCommandLineFlags(&argc, &argv, false);

    b.运行程序时要传入定义的参数
    ./ext –test_int32=200

    然后你就可以把FLAGS_test_int32按200的值使用了

    4.gtest中的使用
    为什么单提了这个?
    因为我原来一直以为,gtest的main函数中
    testing::InitGoogleTest(&argc, argv);
    已经解析了所有命令行参数,其实….根本不是!
    gtest中必须按照这个个顺序调用:

    testing::InitGoogleTest(&argc, argv);
    google::ParseCommandLineFlags(&argc, &argv, false);
    前者只解析gtest自己需要的参数,后者才会解析你定义的;如果顺序反了,会产生ERROR: unknown command line flag ‘gtest_output’. 因为这时gtest定义的参数还不存在,它不认gtest程序默认传入的gtest_output参数。

  • 相关阅读:
    洛谷 2846 (线段树)
    Conclusion
    codevs 2495 水叮当的舞步IDA*
    1247 排排站 USACO(查分+hash)
    洛谷 1373 小a和uim之大逃离
    noip 2012 疫情控制
    poj 1780 code(欧拉路)
    uva 1391 Astronauts(2-SAT)
    uva 1146 Now or late (暴力2-SAT)
    uva 11324 The Largest Clique (Tarjan+记忆化)
  • 原文地址:https://www.cnblogs.com/sure/p/3782790.html
Copyright © 2020-2023  润新知