迭代宏定义的函数

时间:2015-03-24 12:50:26

标签: c++ c-preprocessor

在现有项目中遇到此代码,该项目包括在进程中注入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 ) 

如果只定义了几个函数,那么循环就可以了。但是,当有很多时,似乎编译器并没有将代码全部放在一个块中。这就是为什么我们不能通过递增指针来循环它们。

我通过复制函数和声明一个新数组找到了另一种方法,但我不想在两个文件中维护相同的代码。

projet的程序员说他有同样的问题,他通过删除项目优化来修复它:project-&gt;属性 - &以及c ++ - &GT; optimisation-&GT;禁用

我试过了。也试过项目 - &gt; properties-&gt; c ++ - &gt;代码gen-&gt;启用最小构建 - &gt;否。

我正在使用vs 2012。

1 个答案:

答案 0 :(得分:1)

如果您只是将指针放入数组中,这听起来会更容易。除了你有问题,你不能声明函数/类型并同时填充一个数组(不能用初始化器交错声明,不能在顶层放置有效的语句),意味着这样做意味着重复功能名称列表。

这听起来像是X-macros的工作。 X宏本质上是高阶函数的预处理器变体:宏调用形成并与定义宏的上下文分开保存。这样就可以更改扩展哪个宏,或者应用多个宏。

e.g。 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进行更改的上下文,并更改函数声明宏的含义,以便它可以重用于多个目的

也可以使用&#34; true&#34;预处理器中的高阶宏,但这样做需要either a bit of boilerplate or a metaprogramming library,所以虽然它更优雅,但单个元代码的麻烦可能不值得。