1. Introduction
GFlags est un ensemble de bibliothèques open source pour le traitement des paramètres de ligne de commande open source par Google, y compris la version C ++ et la version python.
Contrairement aux bibliothèques telles que getopt (), les définitions d'indicateur peuvent être dispersées dans divers codes sources au lieu d'être rassemblées. Un fichier source peut définir certains de ses propres indicateurs, et les applications liées au fichier peuvent utiliser ces indicateurs. Cela facilite la réutilisation du code. Si différents fichiers définissent le même drapeau, une erreur sera signalée lors de la liaison.
Deux, définissez les drapeaux dans le programme
La définition d'un drapeau est simple: utilisez simplement la macro correspondante du type que vous souhaitez utiliser.
exemple:
// foo.cc
#include <gflags/glags.h>
DEFINE_bool(big_menu, true, "Include 'advanced' options in the menu listing");
DEFINE_string(languages, "english,french,german",
"comma-separated list of languages to offer in the 'lang' menu");
Types pris en charge:
- DEFINE_bool: booléen
- DEFINE_int32: entier 32 bits
- DEFINE_int64: entier 64 bits
- DEFINE_uint64: entier 64 bits non signé
- DEFINE_double: double
- DEFINE_string: chaîne C ++ La
macro DEFINE contient trois paramètres: le nom de l'indicateur, la valeur par défaut et l'aide décrivant la méthode. L'aide sera affichée lorsque l'indicateur --help est exécuté.
Les indicateurs peuvent être définis dans n'importe quel fichier source, mais chacun ne peut être défini qu'une seule fois. Si vous devez l'utiliser à plusieurs endroits, DEFINEZ dans un fichier et DECLAREZ dans d'autres fichiers. Une meilleure façon est de DÉFINIR dans le fichier .cc et DECLARE dans le fichier .h, afin que vous puissiez utiliser l'indicateur si vous incluez le fichier d'en-tête.
Trois, utilisez le drapeau
L'indicateur peut être défini comme l'utilisation de variables comme normal, juste précédées FLAGS_
du préfixe. Tel que défini dans les exemples précédents FLAGS_big_menu
et FLAGS_languages
deux variables. Peut être lu et écrit comme des variables générales:
if (FLAGS_consider_made_up_languages)
FLAGS_languages += ",klingon"; // implied by --consider_made_up_languages
if (FLAGS_languages.find("finnish") != string::npos)
HandleFinnish();
Quatre, initialisez tous les paramètres
Après avoir défini les paramètres, dites enfin à l'exécuteur de traiter les paramètres passés depuis la ligne de commande afin que les paramètres FLAG définis soient correctement affectés.
Généralement appelé dans une main()
fonction
google::ParseCommandLineFlags(&argc, &argv, true);
argc
Et argv
est-ce que les main
paramètres d'entrée, parce que cette fonction changera leur valeur, sont passés au pointeur.
Le troisième paramètre est appelé remove_flags
. Si c'est vrai , ParseCommandLineFlags
ce sera de la argv
suppression et de leurs paramètres d'identification correspondant à la argc
valeur de réduction . Ensuite, argv
seuls les paramètres de ligne de commande sont conservés.
Au contraire, s'il remove_flags
est faux , il ParseCommandLineFlags
restera argc
inchangé, mais leur ordre sera réajusté pour que le logo soit devant.
Remarque: Le ./foo --big_menu=false arg1
milieu big_menu
est le logo, false
ses paramètres et arg1
les paramètres de ligne de commande.
Cinq signes spéciaux
--help shows all flags from all files, sorted by file and then by name; shows the flagname, its default value, and its help string
--helpfull same as -help, but unambiguously asks for all flags (in case -help changes in the future)
--helpshort shows only flags for the file with the same name as the executable (usually the one containing main())
--helpxml like --help, but output is in xml for easier parsing
--helpon=FILE shows only flags defined in FILE.*
--helpmatch=S shows only flags defined in *S*.*
--helppackage shows flags defined in files in same directory as main()
--version prints version info for the executable
Six, exemple de code
Vous devez d'abord télécharger le code gflags, puis construire et installer
main.cpp
#include <iostream>
#include <gflags/gflags.h>
DEFINE_string(data_path,"./config/","data path");
DEFINE_string(config_path,"./data/","config path");
DEFINE_bool(is_check,false,"check flag");
using namespace std;
int main(int argc,char *argv[])
{
google::SetUsageMessage("usage:");
google::ParseCommandLineFlags(&argc,&argv,true);
cout<<"argc="<<argc<<endl;
cout<<"data_path="<<FLAGS_data_path<<endl;
cout<<"config_path="<<FLAGS_config_path<<endl;
cout<<"is_check="<<FLAGS_is_check<<endl;
return 0;
}
Commande de construction:
g++ -Wall -g main.cpp -o main -I/usr/local/include/gflags -lgflags -lpthread
résultat courant:
Informations plus détaillées:
1 、 github: https://github.com/gflags/gflags
2. Document officiel: https://gflags.github.io/gflags/