linux——网络计算机{序列化及反序列化(JSON)(ifdef的用法)}
linux——网络(服务器的永久不挂——守护进程)-CSDN博客
目录
一、序列化与反序列化
1. 推荐 JSON 库
2. 使用 nlohmann/json 示例
安装方法
基础用法
输出结果
3. 常见操作
4. 其他库对比
5. 选择建议
二、ifdef宏的用法
基本语法
核心用途
进阶用法
注意事项
示例:跨平台日志
一、序列化与反序列化
上篇博客的最后我们介绍序列化与反序列化,这次我们介绍常用的序列化库。
1. 推荐 JSON 库
-
nlohmann/json
现代、易用的头文件库,语法简洁,支持 C++11 及以上。#include <nlohmann/json.hpp> using json = nlohmann::json; // 别名简化
-
RapidJSON
高性能库,适合对速度要求高的场景,但 API 较复杂。 -
JsonCpp
老牌库,功能稳定,但需要编译。
2. 使用 nlohmann/json 示例
安装方法
-
直接包含头文件:下载 json.hpp 到项目目录。
-
包管理器安装(如 vcpkg):
vcpkg 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"]; // "Alice"
int 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 DEBUG std::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)
#endif
int main() {
LOG("程序启动"); // 若未定义PRINT_DEBUG,此行不编译
return 0;
}
通过灵活使用 #ifdef
,可以提升代码的可维护性和跨平台兼容性。
三、网络计算机全部全部代码
网络计算机完结 · 8156655 · MFF的库/linux - Gitee.com