通常需要向可以在不同体系结构上运行的另一个程序发送或接收复杂数据结构,或者可以针对所讨论的数据结构的不同版本设计复杂数据结构。一个典型的例子是一个程序,它在退出时将其状态保存到文件中,然后在启动时将其读回。

“发送”功能通常首先将魔术标识符和版本写入文件或网络套接字,然后逐个(即串行)写入所有数据成员。如果遇到可变长度数组(例如字符串),它将写入一个长度后跟数据,或者它将写入数据后跟一个特殊的终止符。格式通常是XML或二进制; 在后一种情况下,htonl()宏集可能会派上用场。

‘receive’功能几乎相同:它将逐个读取所有项目。可变长度数组可以通过读取计数后跟数据来处理,也可以通过读取数据直到达到特殊终止符来处理。

由于这两个函数通常遵循与数据(结构)声明相同的模式,因此如果它们都可以从通用定义生成,那将是很好的。

X-Macros

一个Wikibookian表明,C语言程序设计/预处理器#X-宏被合并到这本书或章节。

讨论这种合并是否应该在讨论页面上进行。

X-Macros使用预处理器强制编译器多次编译同一段文本。有时会多次包含特殊文件(扩展名为.def)。例如,variables.def可能如下所示:

INT(值)

INT(移位)

在这个例子中,C编程将如下所示:

...

#define INT(var)int var;

#include“variables.def”

#undef INT

...

printf(“version = 1 \ n”);

#define INT(var)printf(#var“=%d \ n”,var);

#include“variables.def”

#undef INT

...

如果不希望多次包括单独的文件,则可以使用另一个宏。例如 :

#define VARIABLES INT(值)\

INT(移位)

该#包括 S可再与调用宏替换。

使用此方法,还可以传入(a)可以在值列表上操作的其他宏的名称。例如:

#define VAR_LIST(_)_(value)\

_(转移)

...

#define VAR_INT_DECL(var)int var;

VAR_LIST(VAR_INT_DECL)

...

printf(“version = 1 \ n”);

#define VAR_INT_PRINTF(var)printf(#var“=%d \ n”,var);

VAR_LIST(VAR_INT_PRINTF)

...

这不需要重新定义宏,并且可以使代码更易于理解和维护。

X-Macros对于保持字符串和枚举类型之间的映射同步特别有用。

版本化序列化

假设我们要在上面的示例中添加其他变量,但我们仍然希望程序能够读取旧版本1文件。然后我们将一个版本参数和一个默认值参数添加到列表处理宏:

#define VAR_LIST(_)_(value,1,0)\

_(班次,1,0)

_(掩模,2,0xffff)

...

int inputVer;

#define VAR_INT_DECL(var,varVer,default)int var;

VAR_LIST(VAR_INT_DECL)

...

scanf(“version =%d”,&inputVer);

#define VAR_INT_SCN(var,varVer,default)if(varVer <= inputVer)scanf(#var“=%d”,&var); else var = default;

VAR_LIST(VAR_INT_SCN)

...

printf(“version = 2 \ n”); / *始终以最高已知版本输出* /

#define VAR_INT_PRT(var,varVer,default)printf(#var“=%d \ n”,var);

VAR_LIST(VAR_INT_PRT)

c语言序列化后只有四位小数,《C编程.高级C》4.序列化相关推荐

  1. 科学计算机法后保留四位小数,四舍五入(一种精确度的计数保留法)_百度百科...

    [sì shě wǔ rù] 四舍五入 (一种精确度的计数保留法) 语音 编辑 锁定 讨论 上传视频 四舍五入是一种精确度的计数保留法,与其他方法本质相同.但特殊之处在于,采用四舍五入,能使被保留部分 ...

  2. cvi中c语言只保留两位小数,CVI编程常见问题与错误-2012.9

    CVI编程常见问题或错误 1.CVI编程时,在程序中插入函数的方法?如何了解该函数隶属那个函数库? (3) 2.如何查看或者找到一个CVI或IMAQ Vision的函数? (4) 3.实验一不能显示曲 ...

  3. OWASP TOP 10(六)反序列化漏洞(序列化和反序列化、漏洞原理、PHP中的序列化和反序列化、魔术方法、Typecho_v1.0中的反序列化漏洞)

    文章目录 反序列化漏洞 一.概述 1. 序列化和反序列化 2. 序列化的目的 二.PHP中的序列化与反序列化 1. 概述 2. 示例序列化与反序列化 3. 反序列化漏洞 - PHP中的魔术方法 - T ...

  4. C语言怎么保留n位小数并且四舍五入(附带两种简单方法)

    网上的方法: 很简单,假如你有一个float型变量a,其值为1.23456,而你只想保留三位小数,也就是希望得到1.235,只需要令: a = (int)(1000.0 * a + 0.5) / 10 ...

  5. C语言学习(十一)小数在内存中是如何存储的?定点数与浮点数各自的优势在哪?规格化浮点数与非规格化浮点数又表示什么?

    C语言学习(十一)小数在内存中是如何存储的?定点数与浮点数各自的优势在哪?规格化浮点数与非规格化浮点数又表示什么? 浮点数与定点数 小数在内存中以浮点数形式存储.浮点数并不是一种数值分类,他和整数.小 ...

  6. 在纸上写好一个c语言程序后,上机运行的基本步骤为,c基本概念(选择题).docx

    PAGE / NUMPAGES 一.单选题 1.下面叙述中正确的是: (A) 在C语言程序中,main()函数必须放在程序的开始位置 (B) 在C语言程序中,要调用的函数必须在main()函数中定义 ...

  7. ubuntu16.04在英文状态下安装中文语言包的过程(法一:图形界面的方式) 以及 安装中文语言包后无法选择汉语问题的解决

    ubuntu16.04在英文状态下安装中文语言包的过程(法一:图形界面的方式) 以及 安装中文语言包后无法选择汉语问题的解决 参考文章: (1)ubuntu16.04在英文状态下安装中文语言包的过程( ...

  8. Python语言学习之数值、小数、空格那些事:python和数值、小数、空格的使用方法之详细攻略

    Python语言学习之数值.小数.空格那些事:python和数值.小数.空格的使用方法之详细攻略 目录 Python与数值那些事 1.python保留两位小数/保留小数点位数 Python去掉空格的方 ...

  9. python 序列化压缩成字符串_Python 将json序列化后的字符串转换成字典(推荐)

    一般而言下面的就可以完成需求了. def convertToDic(data): jsonDic=json.loads(data) return dict(jsonDic) 但实际应用中可能会出现一些 ...

最新文章

  1. 解决 ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES) 问题
  2. 程序基本功之遍历二叉树
  3. 后端程序员必备的Linux基础知识
  4. SAP SD:SAP信贷出口
  5. boost::hana::cartesian_product用法的测试程序
  6. IBASE component deletion
  7. 【DP】[NOI2013]书法家
  8. .Net 分布式云平台基础服务建设说明概要
  9. python 多人连接mysql 进行事务操作 对mysql加锁与释放锁
  10. 使用批处理文件,自动设置计算机IP地址
  11. visio2016专业版2018最新密钥和下载方法 整理
  12. java p12证书_java引用微信支付的p12证书文件
  13. vue 检测ie版本_vue判断当前浏览器为IE低版本,给出升级提示;IE11及其他浏览器正常使用-Go语言中文社区...
  14. 【C语言】VSCode配置C语言开发环境(详细图文)
  15. Latex公式编辑快速入门
  16. react引入antd报错找不到antd/dist/antd.css Module not found: Error: Can‘t resolve ‘antd/dist/antd.css‘ in
  17. window.name属性
  18. Debian修改桌面系统
  19. 赵小楼《天道》《遥远的救世主》深度解析(76)人性的本来是喜欢享受、安逸、舒适的,不舒服的你能接受吗?
  20. 应用层协议的捕获和解析

热门文章

  1. 【HeadFirst设计模式——开篇】
  2. codeforces 679A Bear and Prime 100 交互
  3. 一些算法(最短路,线段树,01,完全背包,STL)的基本参考资料
  4. Xcode 4 with External Static Library for iPhone Development
  5. 在javascript中关于局部变量和全局变量简析
  6. 【CSS布局】已知布局元素的高度,写出三栏布局,要求左栏、右栏宽度各为300px,中间自适应。
  7. Python机器学习库scikit-learn实践
  8. OpenCV3学习(8.3)模板匹配函数matchTemplate详解
  9. linux判断cpu是否过载,Linux CPU 如何判断忙
  10. 7-1 堆栈操作合法性 (15 分)