c - 在打包/解包结构之间切换

标签 c c99 structure packed

我在 EEPROM (4KB) 中有很多配置数据,我以打包结构读取这些数据。在我的固件中,我需要非常频繁地读取/更改这些值,并且打包结构的性能不是最佳的,所以我有第二个结构,它完全相同,只是没有打包。我必须将每个值从打包结构中一一复制到解压结构中,这很容易出错,因为当我向打包结构中添加一个值时,我还必须记住将其添加到复制函数中。

有更聪明的方法吗?

最佳答案

这是使用预编译器执行此操作的过于聪明的方法:

mydata-fields.h

FIELD(int, one)
FIELD(char, two)
FIELD(long, three)

mydata.h

#define FIELD(t, n) t n;
struct MyData
{
#include "mydata-fields.h"
};
struct __attribute__((packed)) MyDataPacked /*or whatever your compiler needs */
{
#include "mydata-fields.h"
};
#undef FIELD

#define FIELD(t, n) a->n = b->n;
static inline void Unpack(MyData *a, MyDataPacked *b)
{
#include "mydata-fields.h"
}
static inline void Pack(MyDataPacked *a, MyData *b)
{
#include "mydata-fields.h"
}
#undef FIELD

更新:只要发挥一点想象力,您甚至可以编写一个通用的 Packed.h,它接收结构体名称和字段文件作为参数:

packed.h 摘录

/* ... */
struct UNPACKED
{
#include FIELDS_H
};
/* and so on... */

然后简单地在真实文件中:

mydata.h

#define UNPACKED MyData
#define PACKED MyDataPacked
#define FIELDS_H "mydata-fields.h"
#include "packed.h"
#undef FIELDS_H
#undef PACKED
#undef UNPACKED

如果您有大量打包/解包结构并希望避免某些输入,这将很有用。

一个不太邪恶的解决方案是编写一个脚本(用 Python!),根据某个输入文本文件中的字段规范生成代码。

关于c - 在打包/解包结构之间切换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14603272/

相关文章:

c - 如何在 Linux 中使用参数执行 C 代码中的外部程序?

c - 导致程序崩溃的结构

C结构;克服将字符串传递给 char

c - C语言中的数组错误

C - TCP 文件传输

c - 使用 scanf() 停止控制台输入

c - 具有不同长度数组成员的结构数组 C

c - c99 中结构体数组的数组

c - 如何在 C 中将 size_t 转换为 int?

c - 用于子级屏幕和菜单的嵌入式软件结构