遍历宏定义的函数
Iterate through macro defined functions
在现有项目中遇到此代码,该项目包括在进程中注入DLL并从中操作。
他们声明了一些函数指针偏移量,然后通过它们进行迭代,将特定的dll偏移量添加到其中
我在遍历宏定义的函数时遇到了困难。如果我只有5-6个功能,它似乎很好用,但当我添加更多功能时,它就不起作用了。
#pragma optimize ( "", off )
#define DLLOFFSET(a1,b1) ((DLLNO_##a1)|((b1)<<8))
#define FUNCPTR(d1,v1,t1,t2,o1) typedef t1 d1##_##v1##_t t2; d1##_##v1##_t *d1##_##v1 = (d1##_##v1##_t *)DLLOFFSET(d1,o1);
#define ASMPTR(d1,v1,o1) DWORD d1##_##v1 = DLLOFFSET(d1,o1);
#define _PTRS_START PREFIX1_aaa
...
FUNCPTR(PREFIX1, aaa, ....., 0xFFFFF)
...
FUNCPTR(PREFIX3, fff, ....., 0xFFFFF)
...
FUNCPTR(PREFIX2, ggg, ....., 0xFFFFF)
...
ASMPTR(PREFIX1, jjj, 0xFFFFF)
...
#define _PTRS_END PREFIX1_jjj
void DefineOffsets()
{
DWORD *p = (DWORD *)&_PTRS_START;
do {
*p = "call update pointer function here"
} while(++p <= (DWORD *)&_PTRS_END);
}
#pragma optimize( "", on )
如果只定义了几个函数,那么循环就可以正常工作。然而,当有很多代码时,编译器似乎并没有将所有代码放在一个块中。因此,为什么我们不能通过增加指针来循环它们。
我找到了另一种方法,复制函数并声明一个新数组,但我不希望在两个文件中维护相同的代码。
该项目的一位程序员表示,他也遇到了同样的问题,他通过从"项目->属性->c++->优化->禁用"中删除项目优化来解决了这个问题。
我试过了。还尝试了项目->属性->c++->代码生成->启用最小构建->否
我使用的是vs 2012。
如果您可以简单地将指针放入数组中,这听起来会容易得多。除了你不能同时声明函数/类型和填充数组的问题(不能将声明与初始值设定项交错,不能将有效的语句放在顶层),这意味着这样做意味着复制函数名称列表。
这听起来像是X宏的工作。X宏本质上是高阶函数的预处理器变体:宏调用是与定义宏的上下文分开形成和保存的。这样就可以更改展开的宏,或者应用多个宏。
例如functions.h
:
FUNCTION(void, f1, puts("in f1"))
FUNCTION(void, f2, puts("in f2"))
FUNCTION(void, f3, puts("in f3"))
FUNCTION(void, f4, puts("in f4"))
FUNCTION(void, f5, puts("in f5"))
main.c
:
#define FUNCTION(T, N, B) T N (void){ B; }
#include "functions.h"
#undef FUNCTION
#define FUNCTION(T, N, B) (fptr)N,
typedef void(*fptr)(void);
fptr funcs[] = {
#include "functions.h"
};
int main(void) {
for (int i = 0; i < 5; i ++) {
funcs[i]();
}
}
函数列表只需要在一个地方维护,但它的include
d的上下文会发生变化,并更改函数声明宏的含义,使其可以用于多种用途。
在预处理器中也可以使用"真正的"高阶宏,但这样做需要一点样板或元编程库,所以虽然它要优雅得多,但可能不值得为一段元代码而烦恼。
相关文章:
- 如何确保C++函数在定义之前声明(如override关键字)
- 有没有什么方法可以使用一个函数中定义的常量变量,也可以由c++中同一程序中的其他函数使用
- 通过函数指针定义类范围之外的方法
- 关于 C++ 中的函数类型定义
- 为什么我不能在主函数之外定义一个类的对象(它继承了另一个类)?
- 在类构造函数中定义结构变量的参数
- C++宏定义和取消定义
- 2个模板化类的非模板友元函数未定义引用错误
- 查找定义我的 C/C++ 函数/宏的文件比'grep'更简单的方法
- C++ 返回指向函数内定义的静态数组的指针是否有效?
- error dllimport 函数的定义不允许在一个特定的联合中,而其他类、结构和联合将按预期导出
- 何时需要实例化函数模板定义?
- 为什么为派生类定义复制构造函数需要定义基类的默认构造函数?
- 虚拟成员函数的定义是否强制在同一转换单元中动态初始化静态数据成员?
- VS2017 #error: : snprintf 的宏定义与标准库函数声明冲突
- 遍历宏定义的函数
- 编译器会删除未使用的函数、定义、变量、宏、include等吗?
- 让宏定义返回函数的值是不好的做法吗?
- 可以将整数变量附加到宏定义的函数上吗?
- c++:复杂的类函数宏定义