这是使用预编译器执行此操作的过于聪明的方法:
FIELD(int, one)
FIELD(char, two)
FIELD(long, three)
Run Code Online (Sandbox Code Playgroud)
#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
Run Code Online (Sandbox Code Playgroud)
更新:只要发挥一点想象力,您甚至可以编写一个通用的 Packed.h 来接收结构体和字段文件的名称作为参数:
/* ... */
struct UNPACKED
{
#include FIELDS_H
};
/* and so on... */
Run Code Online (Sandbox Code Playgroud)
然后简单地在真实文件中:
#define UNPACKED MyData
#define PACKED MyDataPacked
#define FIELDS_H "mydata-fields.h"
#include "packed.h"
#undef FIELDS_H
#undef PACKED
#undef UNPACKED
Run Code Online (Sandbox Code Playgroud)
如果您有很多打包/解包结构并且想要避免一些打字,这将很有用。
一个不太邪恶的解决方案是编写一个脚本(用 Python!),根据某个输入文本文件中的字段规范生成代码。