linux——网络计算机{序列化及反序列化(JSON)(ifdef的用法)}

news/2025/2/9 1:12:55 标签: linux, json, 运维

linux——网络(服务器的永久不挂——守护进程)-CSDN博客


目录

一、序列化与反序列化

1. 推荐 JSON 库

json%20%E7%A4%BA%E4%BE%8B-toc" name="tableOfContents" style="margin-left:80px">2. 使用 nlohmann/json 示例

安装方法

基础用法

输出结果

3. 常见操作

4. 其他库对比

5. 选择建议

二、ifdef宏的用法

基本语法

核心用途

进阶用法

注意事项

示例:跨平台日志


一、序列化与反序列化

上篇博客的最后我们介绍序列化与反序列化,这次我们介绍常用的序列化库。

1. 推荐 JSON 库

  • nlohmann/json
    现代、易用的头文件库,语法简洁,支持 C++11 及以上。

    #include <nlohmann/json.hpp>
    using json = nlohmann::json; // 别名简化

  • RapidJSON
    高性能库,适合对速度要求高的场景,但 API 较复杂。

  • JsonCpp
    老牌库,功能稳定,但需要编译。


json%20%E7%A4%BA%E4%BE%8B" name="2.%C2%A0%E4%BD%BF%E7%94%A8%20nlohmann%2Fjson%20%E7%A4%BA%E4%BE%8B">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

核心用途

  1. 调试代码开关

    #define DEBUG  // 注释此行以关闭调试信息
    
    #ifdef DEBUG
        std::cout << "Debug信息: x = " << x << std::endl;
    #endif

  2. 头文件保护(防止重复包含)

    #ifndef MY_HEADER_H
    #define MY_HEADER_H
    // 头文件内容
    #endif

  3. 跨平台适配

#ifdef _WIN32
    // Windows专用代码
#elif __linux__
    // Linux专用代码
#endif
  1. 功能模块开关

    // 编译时添加 -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


注意事项

  1. 宏定义位置
    宏通常在文件顶部定义,或通过编译器选项定义(如 g++ -DDEBUG)。

  2. 作用域
    宏定义仅在定义之后有效,且遵循文件作用域。

  3. 与 #pragma once 的区别
    #pragma once 是编译器特性(非标准),用于替代头文件保护,但 #ifndef 是标准且跨平台兼容的。

  4. 预处理指令格式
    指令需独占一行,以 # 开头,不可缩进或混入其他代码。


示例:跨平台日志

#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


http://www.niftyadmin.cn/n/5845415.html

相关文章

RabbitMQ 从入门到精通:从工作模式到集群部署实战(五)

#作者&#xff1a;闫乾苓 系列前几篇&#xff1a; 《RabbitMQ 从入门到精通&#xff1a;从工作模式到集群部署实战&#xff08;一&#xff09;》&#xff1a;link 《RabbitMQ 从入门到精通&#xff1a;从工作模式到集群部署实战&#xff08;二&#xff09;》&#xff1a; lin…

用pytorch实现一个简单的图片预测类别

前言&#xff1a; 在阅读本文之前&#xff0c;你需要了解Python&#xff0c;Pytorch&#xff0c;神经网络的一些基础知识&#xff0c;比如什么是数据集&#xff0c;什么是张量&#xff0c;什么是神经网络&#xff0c;如何简单使用tensorboard,DataLoader。 本次模型训练使用的是…

【提示工程】:如何有效与大语言模型互动

随着人工智能技术的快速发展,大语言模型(LLM)如 GPT 系列在各类任务中的应用越来越广泛。从文本生成到代码编写,从数据分析到内容创作,这些模型展现出了强大的能力。然而,要充分发挥大语言模型的潜力,关键在于如何设计高质量的提示词(Prompts)。这门技术被称为提示工程…

深度探索未来的搜索引擎 —— DeepSeek

随着信息时代的进步&#xff0c;我们每天都在生成、分享和消费大量的数据&#xff0c;如何从海量的内容中迅速找到有价值的信息&#xff0c;成为了现代社会的重要课题。传统的搜索引擎虽然在很长时间内引领了互联网的发展&#xff0c;但随着技术的进步和用户需求的变化&#xf…

本地大模型编程实战(08)自制聊天机器人(2)

文章目录 准备使用简单的提示词使用复杂一点的提示词总结代码 本文将演示使用大语言模型自制聊天机器人。主要的内容有&#xff1a; 使用 LangGraph 进一步完善聊天机器人使用提示词改变 LLM 的能力 我们将同时使用 llama3.1 和 deepseek 做演示。由于 langchain 可能对不同大…

python:递归函数与lambda函数

递归函数&#xff1a;1.函数内调用自己 2.有一个出口 1.递归 一.有出口时 def sum(num):if num1:return 1return numsum(num-1) asum(3) print(a) #num3 3sum(2) #num2 2sum(1) #num1是返回1 #即3sum(2&#xff09;即32sum(1)即321运行结果 6 二.无出口时 def sum(num)…

GaussDB用户权限管理

GaussDB用户权限管理 系统权限系统权限查看系统权限授予 角色权限角色权限查看角色权限授予 对象权限对象权限查看对象权限授予 GaussDB数据库中的权限管理可以分为三个级别&#xff1a; 系统权限&#xff1a;包括SYSADMIN、CREATEDB、CREATEROLE、AUDITADMIN和LOGIN等权限。角…

Vue(3)

一.生命周期及其四个阶段 Vue生命周期&#xff1a;一个Vue实例从创建到销毁的整个过程 生命周期四个阶段&#xff1a;①创建②挂载③更新④销毁 <body><div id"app"><h3>{{ title }}</h3><div><button click"count--"&…