当前位置: 首页 > news >正文

LIB-ZC, 一个跨平台(Linux)平台通用C/C++扩展库,命令行参数和配置文件

LIB-ZC, 一个跨平台(Linux)平台通用C/C++扩展库,命令行参数和配置文件

  • 本库 打通了命令行参数和配置文件.
  • 推荐但不强制使用

命令行

命令行参数, 风格/例子

./cmd -name1 val1 arg1 -name2 val2 --bool1 --bool2 arg2 arg3
  • 1个横杠 - 开始的是"参数名", 后面必须跟一个"参数值"
  • 2个横杠 开始的是布尔型的参数, 后面没有"参数值", (逻辑上)值为真
  • 其他参数为普通参数

命令行方法

// 命名空间 zcc::main_argument

// 默认全局配置
extern zcc::config var_main_config;

struct option
{
    const char *key;
    const char *val;
};

// main 函数入口的 argc
extern int var_argc;
// main 函数入口的 argv
extern char **var_argv;
// 命令行参数的 key/value 对
extern std::vector<option> var_options;
// 命令行的参数
extern std::vector<const char *> var_parameters;
// var_parameters.size()
extern int var_parameter_argc;
// (char **)(var_parameters.c_str())
extern char **var_parameter_argv;
// 解析命令行
void run(int argc, char **argv, bool cmd_mode = true);

执行逻辑

已知:
./cmd -name1 val1 arg1 -name2 val2 --bool1 --bool2 arg2 arg3
调用函数
zcc::main_argument::run(argc, argv);
有如下效果:

系统会初始化全局配置变量

var_argc = argc;
var_argv = argv;
progname = argv[0];

而且逻辑上:

// var_main_config
zcc::var_main_config[name1] = val1
zcc::var_main_config[name2] = val2
zcc::var_main_config[bool1] = "yes"
zcc::var_main_config[bool2] = "yes"

// var_options
var_options = {{name1, val1}, {name2, val2}, {boo1, yes}, {bool2, yes}}

// var_parameters
var_parameters = {arg1, arg2, arg3}
另外
  • 如果参数中出现(可以多组) -config somepath.cf, 那么会立即加载配置文件somepath.cf到 zcc::var_main_config
  • 遵循规则: 后加载的配置项覆盖先加载的配置项
  • 遵循规则: 命令行上的配置项覆盖配置文件中的配置项

配置

先看一个配置文件例子,内容如下

# 忽略空行

# 行首第一个非空字符是#, 则忽略本行
     #
# 每配置行以 "=" 为分隔符
# 配置项和配置值都需要过滤掉两侧的空白
# 不支持任何转义
server-command = bin/milter
server-log = syslog,mail

# 相同配置项, 以后一个为准
spamd_server = var/socket/spamd
spamd_server = var/socket/spamd222

config 类

// 线程, 读写不安全
// 线程, 只有读是安全的
class config : public std::map<std::string, std::string>
{
public:
    config();
    ~config();
    config &reset();
    virtual inline void afterUpdate() {};
    config &update(const char *key, const char *val, int vlen = -1);
    config &update(const char *key, const std::string &val);
    config &update(const std::string &key, const std::string &val);
    config &remove(const char *key);
    config &remove(const std::string &key);
    // 从文件加载配置, 且覆盖
    bool load_from_file(const char *pathname);
    bool load_from_file(const std::string &pathname)
    {
        return load_from_file(pathname.c_str());
    }
    // 从另一个配置复制
    config &load_another(config &another);
    config &debug_show();
    // 获取值
    std::string *get_value(const char *key);
    std::string *get_value(const std::string &key);
    const char *get_cstring(const char *key, const char *def_val = "");
    const char *get_cstring(const std::string &key, const char *def_val = "");
    std::string get_string(const char *key, const char *def_val = "");
    std::string get_string(const std::string &key, const char *def_val = "");
    const std::string &get_string(const std::string &key, const std::string &def_val);
    // 获取布尔值, y/Y/t/T/1 => true, n/N/f/F/0 => false
    bool get_bool(const char *key, bool def_val = false);
    bool get_bool(const std::string &key, bool def_val = false);
    // atoi
    int get_int(const char *key, int def_val = 0);
    int get_int(const std::string &key, int def_val = 0);
    // atol
    int64_t get_long(const char *key, int64_t def_val = 0);
    int64_t get_long(const std::string &key, int64_t def_val = 0);
    // 获取时间秒值 1s, 1m, 1h, 1d, 1w
    int64_t get_second(const char *key, int64_t def_val = 0);
    int64_t get_second(const std::string &key, int64_t def_val = 0);
    // 获取大小字节 1b, 1k, 1m, 1g
    int64_t get_size(const char *key, int64_t def_val = 0);
    int64_t get_size(const std::string &key, int64_t def_val = 0);

private:
    void *unused_;
};

相关文章:

  • Redis核心功能实现
  • 科技项目验收测试包括哪些内容?有什么作用?
  • ESP32小智AI机器人全栈开发:从云端部署到语音交互实战(附源码)
  • Eclipse 悬浮提示功能详解
  • Android12源码编译之预置Android Studio项目Android.mk文件编写
  • 泰鸿万立上市:加强产品规划和前瞻性研发 打造优质汽车零部件制造商
  • 电子学会 信息素养大赛图形化、python、c++历年试题
  • C++中的虚克隆模式:实现多态对象的安全深拷贝
  • 最新版DataGrip超详细图文安装教程,带补丁包(2025最新版保姆级教程)
  • 【Bug】BEVFormer配置bug:ModuleNotFoundError: No module named ‘tools.data_converter‘
  • [python] 作用域
  • BlueNRG-LP v3.x 协议栈主要事件列表与含义解析
  • 玩转ESP32-S3:UDP网络通信技术详解
  • 快速支持DeepSeek-V3-0324,昇思MindSpore+vLLM服务化部署开源版本上线魔乐社区
  • 正则表达式学习笔记
  • 深入理解Softmax函数及其在PyTorch中的实现
  • 2025华为OD真题目录:全流程解析/备考攻略/经验分享/Java/python/JavaScript/C++/C语言/GO六种语言最佳实现
  • 从零开始学Python游戏编程21-Pygame库1
  • DDoS攻击:网络世界的“洪峰考验”与应对逻辑
  • k8s证书续期
  • 高端网站开发步骤/无锡网络优化推广公司
  • 莆田市秀屿区建设局网站/百度搜索排行榜
  • 微信公众号做公司网站/东莞今日新闻大事
  • 全球最好的设计网站/直通车怎么开
  • wordpress新建页面连接无法访问/seo公司排名
  • 三个字的洋气商标名字/搜索引擎优化的主要策略