gflags
- 1. 介紹
- 2. 安裝
- 3. 使用
- 3.1 頭文件
- 3.2 定義參數
- 3.3 訪問參數
- 3.4 不同文件訪問參數
- 3.5 初始化所有參數
- 3.6 運行參數設置
- 3.7 配置文件的使用
- 3.8 特殊參數標識
1. 介紹
gflags 是 Google 開發的一個開源庫,用于 C++ 應用程序中命令行參數的聲明、定義和解析。gflags 庫提供了一種簡單的方式來添加、解析和文檔化命令行標志(flags),使得程序可以根據不同的運行時配置進行調整。
它具有如下幾個特點:
- 易于使用:gflags 提供了一套簡單直觀的 API 來定義和解析命令行標志,使得開發者可以輕松地為應用程序添加新的參數。
- 自動幫助和文檔:gflags 可以自動生成每個標志的幫助信息和文檔,這有助于用戶理解如何使用程序及其參數。
- 類型安全:gflags 支持多種數據類型的標志,包括布爾值、整數、字符串等,并且提供了類型檢查和轉換。
- 多平臺支持:gflags 可以在多種操作系統上使用,包括 Windows、Linux 和
macOS。 - 可擴展性:gflags 允許開發者自定義標志的注冊和解析邏輯,提供了強大的擴展性。
官方文檔: https://gflags.github.io/gflags/
代碼倉庫:https://github.com/gflags/gflags.git
2. 安裝
sudo apt install libgflags-dev
3. 使用
3.1 頭文件
使用 gflags 庫來定義/解析命令行參數必須包含如下頭文件
#include<gflags/gflags.h>
3.2 定義參數
利用 gflag 提供的宏定義來定義參數。該宏的 3 個參數分別為命令行參數名,參數默認值,參數的幫助信息。
DEFINE_string(ip,"127.0.0.1","這是服務器的ip地址");
DEFINE_int32(port,8080,"這是服務器的端口");
DEFINE_bool(debug_flag,true,"是否啟動調試");
gflags 支持定義多種類型的宏函數
DEFINE_bool
DEFINE_int32
DEFINE_int64
DEFINE_uint64
DEFINE_double
DEFINE_string
3.3 訪問參數
我們可以在程序中通過 FLAGS_name 像正常變量一樣訪問標志參數。比如在上面的例子中,我們可以通過 FLAGS_ip 和 FLAGS_port 變量來訪問命令行參數。
3.4 不同文件訪問參數
如果想再另外一個文件訪問當前文件的參數,以參數 FLAGS_ip 為例,我們可以使用用宏 DECLARE_string(ip)來聲明引入這個參數。其實這個宏就相當于做了 extern FLAGS_ip, 定義外部鏈接屬性。
3.5 初始化所有參數
當我們定義好參數后,需要告訴可執行程序去處理解析命令行傳入的參數,使得
FLAGS_*變量能得到正確賦值。我們需要在 main 函數中,調用下面的函數來解決命令行傳入的所有參數
google::ParseCommandLineFlags(&argc, &argv, true);
- argc 和 argv 就是 main 的入口參數
- 第三個參數被稱為 remove_flags。如果它為 true, 表示ParseCommandLineFlags 會從 argv 中移除標識和它們的參數,相應減少 argc 值。如果它為 false,ParseCommandLineFlags 會保留 argc 不變,但將會重新調整它們的順序,使得標識在前面。
#include<iostream>
#include<gflags/gflags.h>DEFINE_string(ip,"127.0.0.1","這是服務器的ip地址");
DEFINE_int32(port,8080,"這是服務器的端口");
DEFINE_bool(debug_flag,true,"是否啟動調試");int main(int argc,char* argv[])
{google::ParseCommandLineFlags(&argc, &argv, true);std::cout<<FLAGS_ip<<std::endl;std::cout<<FLAGS_port<<std::endl;std::cout<<FLAGS_debug_flag<<std::endl;return 0;
}
main:main.ccg++ -o $@ $^ -std=c++17 -lgflags
3.6 運行參數設置
gflags 為我們提供了多種命令行設置參數的方式。
string 和 int 設置參數
exec --log_file=“./main.log”
exec -log_file=“./main.log”
exec --log_file “./main.log”
exec -log_file “./main.log”
bool 設置參數
exec --reuse_addr
exec --noreuse_addr
exec --reuse_addr=true
exec --reuse_addr=false
./main --ip="192.168.1.1" --port=9090 --debug_flag=false
3.7 配置文件的使用
配置文件的使用,其實就是為了讓程序的運行參數配置更加標準化,不需要每次運行的時候都手動收入每個參數的數值,而是通過配置文件,一次編寫,永久使用。
需要注意的是,配置文件中選項名稱必須與代碼中定義的選項名稱一致。
-ip=192.168.2.2
-port=7878
-debug_flag=true
3.8 特殊參數標識
gflags 也默認為我們提供了幾個特殊的標識。
--help # 顯示文件中所有標識的幫助信息
--helpfull # 和-help 一樣, 幫助信息更全面一些
--helpshort # 只顯示當前執行文件里的標志
--helpxml # 以 xml 方式打印,方便處理
--version # 打印版本信息,由 google::SetVersionString()設定
--flagfile -flagfile=f #從文件 f 中讀取命令行參數
比如不知道有什么參數,可以使用–help進行查看