C++ 宏以自定义偏移量设置类字段

问题描述

我正在处理一个附加到程序并从目标程序读取一些数据的 dll。我通过查找结构地址并将该地址转换为代码中相应结构的指针来实现此目的。

示例:

class Structure {
   char pad_1[0x30];
   float val1;
   float val2
   char pad_2[0x20];
   Structure* next;
}

这里如果我发现结构的地址是 0x1234 我可以做 (Structure*)0x1234 并且我可以访问它,注意有一些填充值,这些值我根本不知道它们是什么或者我不需要它们。

我想在我的代码中编写这个结构体(出于可维护性目的),如下所示:

class Structure {
   Offset(0x30)
   float val1;
   float val2;

   Offset(0x58) /// 0x30 + 2x floats + 0x20 padding
   Structure* next;
}

这个Offset宏应该自动添加padding,基本上用Offset(num) u指定类中字段的偏移量,这个宏应该自动添加这个padding。

我不知道这是否可以用 C 宏实现,现在我正在 YAML 中定义我的模型并使用 python 脚本来生成它们,但是这有一些缺点......

解决方法

在我看来,您想要做的是本质上使宏扩展为给定大小的 char 数组。这里唯一棘手的是结构成员的唯一名称,您可以在宏中使用 __LINE__ 和双步连接来实现:

#define TOKENPASTE(x,y) x ## y
#define TOKENPASTE2(x,y) TOKENPASTE(x,y)
#define OFFSET(size) char TOKENPASTE2(pad_,__LINE__)[size]

并按照您想要的方式使用它。请注意,您会获得一些神秘的结构成员名称,这些名称在代码中不可见,但在开发过程中可能在 IDE 中可见。我不确定它是否真的更易于维护,我只会手动将字符数组放在那里。

原答案来自:Creating C macro with ## and __LINE__ (token concatenation with positioning macro)