谷歌開源庫gflags詳細說明

目錄

一.gflags 介紹

二.gflags安裝

三.gflags使用

1.包含頭文件

2.定義參數

3.訪問參數

4.不同文件訪問參數

5.初始化所有參數

6.運行參數設置

7.配置文件的使用

8.特殊參數標識

四.總結


一.gflags 介紹

????????gflags 是 Google 開發的一個開源庫,用于 C++ 應用程序中命令行參數的聲明、定義和解析。gflags 庫提供了一種簡單的方式來添加、解析和文檔化命令行標志(flags),使得程序可以根據不同的運行時配置進行調整。

它具有如下幾個特點

  • 易于使用gflags 提供了一套簡單直觀的 API 來定義和解析命令行標志,使得開發者可以輕松地為應用程序添加新的參數;
  • 自動幫助和文檔gflags 可以自動生成每個標志的幫助信息和文檔,這有助于用戶理解如何使用程序及其參數;
  • 類型安全gflags 支持多種數據類型的標志,包括布爾值、整數、字符串等,并且提供了類型檢查和轉換;
  • 多平臺支持gflags 可以在多種操作系統上使用,包括 WindowsLinux macOS;
  • 可擴展性gflags 允許開發者自定義標志的注冊和解析邏輯,提供了強大的擴展性。

官方文檔:https://gflags.github.io/gflags/

代碼倉庫:https://github.com/gflags/gflags.git

二.gflags安裝

直接命令安裝:

sudo apt-get install libgflags-dev

源碼安裝:

# 下載源碼
git clone https://github.com/gflags/gflags.git
# 切換目錄
cd gflags/
mkdir build
cd build/
# 生成 Makefile
cmake ..
# 編譯代碼
make
# 安裝
make install

????????未報錯則安裝完畢。

三.gflags使用

1.包含頭文件

????????使用 gflags 庫來定義/解析命令行參數必須包含如下頭文件。

#include <gflags/gflags.h>

2.定義參數

????????利用 gflag 提供的宏定義來定義參數。該宏的 3 個參數分別為命令行參數名,參數默認值,參數的幫助信息。

DEFINE_bool(reuse_addr, true, "是否開始網絡地址重用選項");
DEFINE_int32(log_level, 1, "日志等級:1-DEBUG, 2-WARN, 3-ERROR");
DEFINE_string(log_file, "stdout", "日志輸出位置設置,默認為標準輸出");

gflags 支持定義多種類型的宏函數:

DEFINE_bool
DEFINE_int32
DEFINE_int64
DEFINE_uint64
DEFINE_double
DEFINE_string

3.訪問參數

????????我們可以在程序中通過 FLAGS_name 像正常變量一樣訪問標志參數。比如在上面的例子中,我們可以通過 FLAGS_big_menu FLAGS_languages 變量來訪問命令行參數。

4.不同文件訪問參數

????????如果想再另外一個文件訪問當前文件的參數,以參數 FLAGS_big_menu 為例,我們可以使用用宏 DECLARE_bool(big_menu)來聲明引入這個參數。

????????其實這個宏就相當于做了 extern FLAGS_big_menu, 定義外部鏈接屬性。

5.初始化所有參數

????????當我們定義好參數后,需要告訴可執行程序去處理解析命令行傳入的參數,使得FLAGS_*變量能得到正確賦值。我們需要在 main 函數中,調用下面的函數來解決命令行傳入的所有參數。

google::ParseCommandLineFlags(&argc, &argv, true);
  • argc argv 就是 main 的入口參數;
  • 第三個參數被稱為 remove_flags。如果它為 true, 表示ParseCommandLineFlags 會從 argv 中移除標識和它們的參數,相應減少 argc 的值;如果它為 false,ParseCommandLineFlags 會保留 argc 不變,但將會重新調整它們的順序,使得標識再前面。這里的說明比較晦澀,下面我在Linux上寫代碼進行輸出來演示。

????????首先是第三個參數設置為false,我在命令行對命令行參數進行設置,而不使用默認值,因為如果使用默認值的話,argc的值在第三個參數設置為true和false的情況下是一樣的,就看不出區別。

代碼如下:

#include <gflags/gflags.h>
#include <iostream>DEFINE_string(ip, "127.0.0.1", "這是服務器監聽ip地址,格式:127.0.0.1");
DEFINE_int32(port, 8080, "這是服務器監聽端口,格式:8080");
DEFINE_bool(enableDebug, true, "是否開啟調試模式,格式:true/false");int main(int argc, char* argv[])
{google::ParseCommandLineFlags(&argc, &argv, false);std::cout << "argc的值是:" << argc << std::endl;std::cout << "FLAGS_作為前綴版本:" << std::endl;std::cout << FLAGS_ip << std::endl;std::cout << FLAGS_port << std::endl;std::cout << FLAGS_enableDebug << std::endl;std::cout << "argv數組進行訪問的版本" << std::endl;for(int i = 0;i < argc;i++){std::cout << argv[i] << std::endl;}return 0;
}

shell命令:

./main --ip="47.235.41.48" --port=9090 --enableDebug=false

輸出:

????????可以看到,argv中包含了完整的命令行參數,包括可執行文件總共四個,下面我們看看第三個參數為true的情況。

代碼只是將第三個參數設置為true,其它不變,輸出如下:

? ? ? ? 這時候argv中就只有可執行文件的命令行內容了,argc也相應的變成了1,。也就是說,設置為true的情況下將gflags自定義的命令行參數給刪除了,argc也相應減少。設置為true是我個人經常使用和推薦的版本,因為訪問gflags命令行參數時,我們直接使用“FLAGS_”作為前綴即可,這樣不用自己進行字符串解析,非常的方便。?

6.運行參數設置

????????gflags 為我們提供了多種命令行設置參數的方式。

string 和 int 設置參數

exec --log_file="./main.log"
exec -log_file="./main.log"
exec --log_file "./main.log"
exec -log_file "./main.log"

????????int版本的設置則是不加雙引號,其它沒有什么不同。

bool 設置參數

exec --reuse_addr
exec --noreuse_addr
exec --reuse_addr=true
exec --reuse_addr=false

? ? ? ? 上面命令行中沒有聲明true或者false的前兩行的意思就是設置為true,簡化了書寫。

????????另外有一點專門的說明,--單獨使用將會終止標識的處理。比如在 exec -f1 1 -- -f2 2 中, f1 被認為是一個標識,但 f2 不會。

7.配置文件的使用

????????配置文件的使用,其實就是為了讓程序的運行參數配置更加標準化,不需要每次運行的時候都手動收入每個參數的數值,而是通過配置文件,一次編寫,永久使用。

????????需要注意的是,配置文件中選項名稱必須與代碼中定義的選項名稱一致。

例子,配置文件main.conf

--ip="222.2.2.2"
--port=7777
--enableDebug=false

命令行

./main --flagfile=./main.conf

????????這里需要用到--flagfile這個選項來指明配置文件的地址。

? ? ? ? 輸出時則輸出配置文件中的內容。

8.特殊參數標識

????????gflags 也默認為我們提供了幾個特殊的標識。

--help # 顯示文件中所有標識的幫助信息
--helpfull # 和-help 一樣, 幫助信息更全面一些
--helpshort # 只顯示當前執行文件里的標志
--helpxml # 以 xml 方式打印,方便處理
--version # 打印版本信息,由 google::SetVersionString()設定
--flagfile -flagfile=f #從文件 f 中讀取命令行參數

四.總結

? ? ? ? 以上就是gflags的使用,非常的簡單,并且允許在程序各個地方進行命令行參數的定義,不止在main函數中,但有一個缺點,也就是在兩個文件中定義了名字相同的命令行參數,并且這兩個文件進行了鏈接,那么程序就會編譯報錯,這就要求我們開發人員要格外小心。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/88942.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/88942.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/88942.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Python爬蟲實戰:研究XlsxWriter 庫相關技術

1. 研究背景與意義 1.1 網絡爬蟲技術價值 網絡爬蟲作為數據采集的核心工具,在金融、醫療、教育等領域發揮關鍵作用。據 Statista 數據顯示,2025 年全球大數據市場規模預計達 3250 億美元,高效的數據獲取能力成為企業核心競爭力。Python 以其 80% 的市場占有率成為爬蟲開發首…

ThreadLocal內部結構深度解析(Ⅰ)

目錄 使用ThreadLocal 例子 內部結構分析 源碼解析 圖示詳解 ThreadLocal是Java中一個非常重要且常用的線程局部變量工具類&#xff0c;它使得每個線程可以獨立地持有自己的變量副本&#xff0c;而不是共享變量&#xff0c;解決了多線程環境下變量共享的線程安全問題。下面我…

Python 數據挖掘之數據探索

在數據挖掘的流程中&#xff0c;數據探索是非常關鍵的第一步&#xff0c;它能幫助我們深入了解數據的特點&#xff0c;為后續的預處理和模型構建打下堅實的基礎。我們主要圍繞四個方面展開&#xff1a;數據對象與特征、數據統計描述、數據可視化以及相關性和相似性度量。一、數…

高并發點贊場景Synchronized、AtomicLong、LongAdder 和 LongAccumulator性能分析

在高并發點贊場景中&#xff0c;我們需要一個高效、線程安全的計數器來記錄點贊數。synchronized、AtomicLong、LongAdder 和 LongAccumulator 都是 Java 中用于實現原子操作的類&#xff0c;但它們的性能在高并發下差異顯著。性能主要取決于線程競爭程度&#xff1a;競爭越高&…

postgreSQL的sql語句

目錄 一&#xff1a;前提準備1.postgreSQL的安裝可以參考我下面一片文章&#xff1a; 二&#xff1a;SQL語句 1.相同點&#xff1a;支持標準sql類型 2.參考詳細學習地址&#xff1a; 3.postgresql與mysql的不同點 一&#xff1a;前提準備 1.postgreSQL的安裝可以參考我下面…

vue3 JavaScript 數據累加 reduce

在Vue 3中&#xff0c;你可以使用JavaScript的reduce方法來處理數據累加。reduce方法通常用在數組上&#xff0c;它將數組中的每個元素通過一個累加器函數&#xff08;accumulator&#xff09;從左到右累積&#xff0c;最終生成一個單一的值。這在計算總和、累加值等場景中非常…

史上最清楚!讀者,寫者問題(操作系統os)

讀者-寫者問題是另一個里程碑式的同步互斥問題。它比生產者-消費者更復雜&#xff0c;因為它引入了不對稱的訪問權限&#xff1a;讀者和讀者之間是共享的&#xff0c;但寫者和任何人&#xff08;包括讀者和其他寫者&#xff09;之間都是互斥的。我們用一個生動的比喻來解析這個…

使用Starrocks替換Clickhouse的理由

背景 Starrocks和clickhouse都是非常優秀的OLAP數據庫&#xff0c;那么什么情況下使用clickhouse&#xff0c;什么場景下使用starrocks呢&#xff0c;本文就簡單列舉一下他們的優缺點 理由 首先兩者都是列存儲&#xff0c;并且都實現了列壓縮&#xff0c;所以從存儲中兩者的壓縮…

Mybatis 兩級緩存可能導致的問題

Mybatis 兩級緩存可能導致的問題兩級緩存簡介一級緩存 localCache效果開關二級緩存兩級緩存可能導致的問題分布式環境下查詢到過期數據事務隔離級別失效讀已提交失效讀未提交失效總結兩級緩存簡介 一級緩存 localCache 效果 一級緩存是 session 或者說事務級別的&#xff0c…

vue3+uniapp 使用vue-plugin-hiprint中實現打印效果

前言&#xff1a; vue3uniapp 使用vue-plugin-hiprint中實現打印效果 官網地址&#xff1a;gitee https://gitee.com/ccsimple/vue-plugin-hiprinthttps://gitee.com/ccsimple/vue-plugin-hiprint 實現效果&#xff1a; 預覽打印內容&#xff1a; 實現步驟&#xff1a; 1、安…

【elementUI踩坑記錄】解決 el-table 固定列 el-table__fixed 導致部分滾動條無法拖動的問題

目錄一、問題背景二、 問題現象三、核心原因四、解決辦法增強方案&#x1f680;寫在最后一、問題背景 在使用 Element UI 的 el-table 組件時&#xff0c;固定列功能雖然實用&#xff0c;但會引發滾動條交互問題&#xff1a; 固定列區域懸浮顯示滾動條但無法正常拖動滾動條 …

【機器人編程基礎】python文件的打開和關閉

文件的打開和關閉 在Python中,文件操作是一項基本而重要的任務,涉及到打開、讀取、寫入、關閉文件等操作。正確地管理文件對于數據持久化、輸入輸出處理等至關重要。下面將詳細解釋如何在Python中打開和關閉文件,并提供相應的代碼示例。 文件打開 在Python中,可以使用內…

ShenYu實戰、問題記錄

概述 一款高性能的國產的Apache開源API網關&#xff0c;官方文檔。 在ShenYu v2.6.1, ShenYu注冊中心只支持http類型&#xff0c;中間件注冊類型已經被移除。 所以&#xff0c;請使用http注冊類型來注冊你的服務。不是微服務注冊中心&#xff0c;它只是將元數據、選擇器數據、…

走近科學IT版:EasyTire設置了ip,但是一閃之后就變回到原來的dhcp獲得的地址

EasyTier 是一款簡單、安全、去中心化的內網穿透和異地組網工具&#xff0c;適合遠程辦公、異地訪問、游戲加速等多種場景。無需公網 IP&#xff0c;無需復雜配置&#xff0c;輕松實現不同地點設備間的安全互聯。 上次實踐的記錄&#xff1a;適合遠程辦公、異地訪問的EasyTier…

rk3588平臺USB 3.0 -OAK深度相機適配方法

目錄 文件更改記錄表 1、usb規則添加 2、拉取相關依賴 3、安裝python3、安裝pip 4、安裝依賴 5、安裝ffmeg 6、攝像頭功能測試 7、將視頻拷貝到U盤查看 1、usb規則添加 由于OAK是USB設備,因此為了在使用 udev 工具的系統上與之通信, 您需要添加udev規則以使…

工廠模式總結

工廠模式1. 簡單工廠模式&#xff08;Simple Factory&#xff09; 核心思想 定義一個工廠類&#xff0c;根據輸入參數創建不同的具體對象。客戶端不直接調用具體類的構造函數&#xff0c;而是通過工廠類獲取對象。 示例代碼 #include <iostream> #include <memory>…

MySQL的三種安裝方式(mis、zip、yum)

目錄 2.0數據庫安裝 2.1windows上.mis格式 環境準備 MySQL的安裝 環境配置&#xff08;非必要&#xff09; 2.2windows上.zip格式安裝 環境準備 配置文件的內容 MySQL的安裝 附錄可能出現問題 圖形工具遠程連接數據庫 2.3Linux上安裝yum包 環境準備 過程命令 My…

串口學習和藍牙通信HC05(第八天)

&#x1f468;?&#x1f4bb;個人主頁&#xff1a;開發者-削好皮的Pineapple! &#x1f468;?&#x1f4bb; hello 歡迎 點贊&#x1f44d; 收藏? 留言&#x1f4dd; 加關注?! &#x1f468;?&#x1f4bb; 本文由 削好皮的Pineapple! 原創 &#x1f468;?&#x1f4b…

設計總監的“輕量化”新武器:用Adobe Express,音頻一鍵驅動動畫

在快節奏的創意項目中&#xff0c;如何將復雜的設計理念或冗長的研究報告&#xff0c;快速轉化為易于理解、富有吸引力的動態內容&#xff0c;是衡量一個團隊溝通效率的關鍵。作為一名在海外設計界工作了十余年的設計師&#xff0c;我發現&#xff0c;最高效的團隊&#xff0c;…

零知開源——STM32F407VET6驅動SHT41溫濕度傳感器完整教程

?零知開源是一個真正屬于國人自己的開源軟硬件平臺&#xff0c;在開發效率上超越了Arduino平臺并且更加容易上手&#xff0c;大大降低了開發難度。零知開源在軟件方面提供了完整的學習教程和豐富示例代碼&#xff0c;讓不懂程序的工程師也能非常輕而易舉的搭建電路來創作產品&…