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 -
linuxCentOS 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 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

相关文章:
linux——网络计算机{序列化及反序列化(JSON)(ifdef的用法)}
linux——网络(服务器的永久不挂——守护进程)-CSDN博客 目录 一、序列化与反序列化 1. 推荐 JSON 库 2. 使用 nlohmann/json 示例 安装方法 基础用法 输出结果 3. 常见操作 4. 其他库对比 5. 选择建议 二、ifdef宏的用法 基本语法 核心用途…...
【教程】docker升级镜像
转载请注明出处:小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你,欢迎[点赞、收藏、关注]哦~ 目录 自动升级 手动升级 无论哪种方式,最重要的是一定要通过-v参数做数据的持久化! 自动升级 使用watchtower,可…...
迅为RK3568开发板篇OpenHarmony实操HDF驱动控制LED-编写应用APP
在应用代码中我们实现如下功能: 当应用程序启动后会获取命令行参数。如果命令行没有参数,LED 灯将循环闪烁;如果命令行带有参数,则根据传输的参数控制 LED 灯的开启或关闭。通过 HdfIoServiceBind 绑定 LED灯的 HDF 服务ÿ…...
python代码
python\main_script.py from multiprocessing import Process import subprocessdef call_script(args):# 创建一个新的进程来运行script_to_call.pyprocess Process(targetrun_script, args(args[0], args[1]))process.start()process2 Process(targetrun_script, args(arg…...
React 打印插件 -- react-to-print
一、安装依赖 npm install react-to-print 二、使用 import { useReactToPrint } from "react-to-print"; import React, { useRef, forwardRef } from react;const Content () > {const contentRef useRef(null);const reactToPrintFn useReactToPrint({ c…...
探索C语言简易计算器程序的实现与优化
在C语言编程学习中,实现一个简易计算器是一个常见且有趣的练习项目。它不仅能帮助我们巩固基本的语法知识,如函数、循环、分支结构,还能让我们深入理解程序设计的逻辑。接下来,我们将分析三段实现简易计算器功能的C语言代码&#…...
深入了解 MySQL:从基础到高级特性
引言 在当今数字化时代,数据的存储和管理至关重要。MySQL 作为一款广泛使用的开源关系型数据库管理系统(RDBMS),凭借其高性能、可靠性和易用性,成为众多开发者和企业的首选。本文将详细介绍 MySQL 的基础概念、安装启…...
OSPF基础(1):工作过程、状态机、更新
OSPF基础 1、技术背景(与RIP密不可分,因为RIP中存在的问题) RIP中存在最大跳数为15的限制,不能适应大规模组网周期性发送全部路由信息,占用大量的带宽资源以路由收敛速度慢以跳数作为度量值存在路由环路可能性每隔30秒…...
工业相机如何获得更好的图像色彩
如何获得更好的图像色彩 大部分的工业自动化检测中对物体的色彩信息并不敏感,因此会使用黑白的相机,但是在显微镜成像、颜色分类识别等领域,相机的色彩还原就显得格外重要,在调节相机色彩方面的参数时,有以下几个方面需…...
使用requestAnimationFrame减少浏览器重绘
文章目录 介绍使用使用rAF前使用rAF后 介绍 在屏幕中,浏览器通常都以60FPS(1/60 s)每帧更新屏幕,但是当前端绑定了一些高频事件,如鼠标移动,屏幕滚动、触摸滑动等时,在一帧的周期内,…...
Mac 终端命令大全
—目录操作— ꔷ mkdir 创建一个目录 mkdir dirname ꔷ rmdir 删除一个目录 rmdir dirname ꔷ mvdir 移动或重命名一个目录 mvdir dir1 dir2 ꔷ cd 改变当前目录 cd dirname ꔷ pwd 显示当前目录的路径名 pwd ꔷ ls 显示当前目录的内容 ls -la ꔷ dircmp 比较两个目录的内容 di…...
如何使用deepseek开发一个翻译API
什么是deepseek Deepseek 是一个基于人工智能技术的自然语言处理平台,提供了多种语言处理能力,包括文本翻译、语义分析、情感分析等。它通过深度学习模型和大规模语料库训练,能够实现高质量的文本翻译和多语言理解。Deepseek 的核心优势在于…...
vue如何解决跨域
文章目录 vue如何解决跨域1. 什么是跨域2. 如何解决2.1 CROS(Cross-Origin Resource Sharing,跨域资源共享)2.2 Proxy2.2.1 使用webpack proxy2.2.2 服务端代理转发2.2.3 通过nginx实现代理 vue如何解决跨域 1. 什么是跨域 跨域本质是浏览器…...
红包雨项目前端部分
创建项目 pnpm i -g vue/cli vue create red_pakage pnpm i sass sass-locader -D pnpm i --save normalize.css pnpm i --save-dev postcss-px-to-viewportpnpm i vantlatest-v2 -S pnpm i babel-plugin-import -Dhttps://vant.pro/vant/v2/#/zh-CN/<van-button click&…...
新版AndroidStudio 修改 jdk版本
一、问题 之前,在安卓项目中配置JDK和Gradle的过程非常直观,只需要进入Android Studio的File菜单中的Project Structure即可进行设置,十分方便。 如下图可以在这修改JDK: 但是升级AndroidStudio之后,比如我升级到了Android Stu…...
【golang学习之旅】使用VScode安装配置Go开发环境
1. 下载并安装Go 1.1 下载地址1.2 选择版本并下载1.3 安装目录1.4 验证是否安装成功 2. 配置环境变量 2.1 配置步骤2.2 GO部分环境变量说明 3. 下载或更新 Vscode 3.1 下载地址3.2 安装步骤 4. 为Go开发配置VScode 1. 下载并安装Go 1.1 下载地址 https://studygolang.com/dl…...
langchain教程-2.prompt
前言 该系列教程的代码: https://github.com/shar-pen/Langchain-MiniTutorial 我主要参考 langchain 官方教程, 有选择性的记录了一下学习内容 这是教程清单 1.初试langchain2.prompt3.OutputParser/输出解析4.model/vllm模型部署和langchain调用5.DocumentLoader/多种文档…...
GGML、GGUF、GPTQ 都是啥?
GGML、GGUF和GPTQ是三种与大型语言模型(LLM)量化和优化相关的技术和格式。它们各自有不同的特点和应用场景,下面将详细解释: 1. GGML(GPT-Generated Model Language) 定义:GGML是一种专为机器学习设计的张量库,由Georgi Gerganov创建。它最初的目标是通过单一文件格式…...
C++ 原码、反码、补码和位操作符
目录 一、原码、反码、补码 二、位操作符 1、左移操作符是双⽬操作符 移位规则:左边抛弃、右边补 0 2、右移操作符是双⽬操作符 逻辑右移:左边⽤ 0 填充,右边丢弃算术右移:左边⽤原该值的符号位填充,右边丢弃 3、…...
idea中git版本回退
idea中git版本回退 将dev分支代码合并到master分支执行回退步骤 将dev分支代码合并到master分支 #合并成功之后 执行回退步骤 #在指定的版本上 右键 #这里选择【Hard】彻底回退 #本地的master分支回退成功 #将本地的master强制推送到远程,需要执行命令 git p…...
C++:std::is_convertible
C++标志库中提供is_convertible,可以测试一种类型是否可以转换为另一只类型: template <class From, class To> struct is_convertible; 使用举例: #include <iostream> #include <string>using namespace std;struct A { }; struct B : A { };int main…...
遍历 Map 类型集合的方法汇总
1 方法一 先用方法 keySet() 获取集合中的所有键。再通过 gey(key) 方法用对应键获取值 import java.util.HashMap; import java.util.Set;public class Test {public static void main(String[] args) {HashMap hashMap new HashMap();hashMap.put("语文",99);has…...
【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表
1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...
新能源汽车智慧充电桩管理方案:新能源充电桩散热问题及消防安全监管方案
随着新能源汽车的快速普及,充电桩作为核心配套设施,其安全性与可靠性备受关注。然而,在高温、高负荷运行环境下,充电桩的散热问题与消防安全隐患日益凸显,成为制约行业发展的关键瓶颈。 如何通过智慧化管理手段优化散…...
学校时钟系统,标准考场时钟系统,AI亮相2025高考,赛思时钟系统为教育公平筑起“精准防线”
2025年#高考 将在近日拉开帷幕,#AI 监考一度冲上热搜。当AI深度融入高考,#时间同步 不再是辅助功能,而是决定AI监考系统成败的“生命线”。 AI亮相2025高考,40种异常行为0.5秒精准识别 2025年高考即将拉开帷幕,江西、…...
MySQL账号权限管理指南:安全创建账户与精细授权技巧
在MySQL数据库管理中,合理创建用户账号并分配精确权限是保障数据安全的核心环节。直接使用root账号进行所有操作不仅危险且难以审计操作行为。今天我们来全面解析MySQL账号创建与权限分配的专业方法。 一、为何需要创建独立账号? 最小权限原则…...
JS设计模式(4):观察者模式
JS设计模式(4):观察者模式 一、引入 在开发中,我们经常会遇到这样的场景:一个对象的状态变化需要自动通知其他对象,比如: 电商平台中,商品库存变化时需要通知所有订阅该商品的用户;新闻网站中࿰…...
Java毕业设计:WML信息查询与后端信息发布系统开发
JAVAWML信息查询与后端信息发布系统实现 一、系统概述 本系统基于Java和WML(无线标记语言)技术开发,实现了移动设备上的信息查询与后端信息发布功能。系统采用B/S架构,服务器端使用Java Servlet处理请求,数据库采用MySQL存储信息࿰…...
uniapp手机号一键登录保姆级教程(包含前端和后端)
目录 前置条件创建uniapp项目并关联uniClound云空间开启一键登录模块并开通一键登录服务编写云函数并上传部署获取手机号流程(第一种) 前端直接调用云函数获取手机号(第三种)后台调用云函数获取手机号 错误码常见问题 前置条件 手机安装有sim卡手机开启…...
uniapp 字符包含的相关方法
在uniapp中,如果你想检查一个字符串是否包含另一个子字符串,你可以使用JavaScript中的includes()方法或者indexOf()方法。这两种方法都可以达到目的,但它们在处理方式和返回值上有所不同。 使用includes()方法 includes()方法用于判断一个字…...
