网站颜色,视频网站后台功能,网站查询平台,杭州网站设计公司推荐linux——网络#xff08;服务器的永久不挂——守护进程#xff09;-CSDN博客 目录
一、序列化与反序列化
1. 推荐 JSON 库
2. 使用 nlohmann/json 示例
安装方法
基础用法
输出结果
3. 常见操作
4. 其他库对比
5. 选择建议
二、ifdef宏的用法
基本语法
核心用途…linux——网络服务器的永久不挂——守护进程-CSDN博客 目录
一、序列化与反序列化
1. 推荐 JSON 库
2. 使用 nlohmann/json 示例
安装方法
基础用法
输出结果
3. 常见操作
4. 其他库对比
5. 选择建议
二、ifdef宏的用法
基本语法
核心用途
进阶用法
注意事项
示例跨平台日志 一、序列化与反序列化
上篇博客的最后我们介绍序列化与反序列化这次我们介绍常用的序列化库。
1. 推荐 JSON 库 nlohmann/json 现代、易用的头文件库语法简洁支持 C11 及以上。 #include nlohmann/json.hpp
using json nlohmann::json; // 别名简化 RapidJSON 高性能库适合对速度要求高的场景但 API 较复杂。 JsonCpp 老牌库功能稳定但需要编译。 2. 使用 nlohmann/json 示例
安装方法 直接包含头文件下载 json.hpp 到项目目录。 包管理器安装如 vcpkgvcpkg install nlohmann-json linux CentOS 7安装JSON yum install epel-release
基础用法
#include iostream
#include nlohmann/json.hpp
using json nlohmann::json;int main() {// 解析 JSON 字符串json j json::parse(R({name: Alice, age: 25, scores: [90, 85]}));std::string name j[name]; // Aliceint age j[age]; // 25// 修改数据j[age] 26;j[scores].push_back(95); // 添加元素// 生成 JSON 字符串std::string json_str j.dump(4); // 缩进4空格格式化std::cout json_str std::endl;return 0;
}
输出结果
{age: 26,name: Alice,scores: [90, 85, 95]
} 3. 常见操作 嵌套对象 json j;
j[user][id] 123;
j[user][tags] {admin, developer}; 异常处理 try {json j json::parse(invalid_json_str);
} catch (const json::parse_error e) {std::cerr 解析错误: e.what() std::endl;
} 文件读写 // 从文件读取
std::ifstream file(data.json);
json j;
file j;// 写入文件
std::ofstream out(output.json);
out j.dump(4); 4. 其他库对比
库优点缺点nlohmann/json语法简洁易用性强性能稍低RapidJSON性能极高内存占用小API 复杂需手动管理JsonCpp稳定兼容性好需要编译 5. 选择建议 快速开发优先选择 nlohmann/json。 高性能场景使用 RapidJSON。 兼容旧项目考虑 JsonCpp。 二、ifdef宏的用法
基本语法
#ifdef 宏名称// 如果宏已定义编译此代码
#else// 如果宏未定义编译此代码可选
#endif 核心用途 调试代码开关 #define DEBUG // 注释此行以关闭调试信息#ifdef DEBUGstd::cout Debug信息: x x std::endl;
#endif 头文件保护防止重复包含 #ifndef MY_HEADER_H
#define MY_HEADER_H
// 头文件内容
#endif 跨平台适配
#ifdef _WIN32// Windows专用代码
#elif __linux__// Linux专用代码
#endif 功能模块开关 // 编译时添加 -DUSE_FEATURE_A 启用功能
#ifdef USE_FEATURE_A// 功能A的代码
#endif 进阶用法 #if defined 组合条件 支持逻辑运算符, ||, ! #if defined(DEBUG) (VERSION 3)// 当DEBUG已定义且版本≥3时编译
#endif #ifndef 反向检查 等价于 #if !defined #ifndef RELEASE// 若未定义RELEASE则编译
#endif 注意事项 宏定义位置 宏通常在文件顶部定义或通过编译器选项定义如 g -DDEBUG。 作用域 宏定义仅在定义之后有效且遵循文件作用域。 与 #pragma once 的区别 #pragma once 是编译器特性非标准用于替代头文件保护但 #ifndef 是标准且跨平台兼容的。 预处理指令格式 指令需独占一行以 # 开头不可缩进或混入其他代码。 示例跨平台日志
#include iostream// 编译时定义 -DPRINT_DEBUG 启用调试输出
#ifdef PRINT_DEBUG#define LOG(msg) std::cout [LOG] msg std::endl
#else#define LOG(msg)
#endifint main() {LOG(程序启动); // 若未定义PRINT_DEBUG此行不编译return 0;
} 通过灵活使用 #ifdef可以提升代码的可维护性和跨平台兼容性。
三、网络计算机全部全部代码
网络计算机完结 · 8156655 · MFF的库/linux - Gitee.com