基于for循环增量的函数指针的C宏扩展

C macro expansion of a function pointer based on for loop incrementor

我有一个函数,它接受一个指向函数的指针作为参数。 由于函数指针名称的相似性质,此函数在 for 循环中被调用,我使用宏将名称扩展到函数中。它看起来像这样:

void fill(int, int(*funcbase)(int));
int funcbase0(int);
int funcbase1(int);
int funcbase2(int);
int funcbase3(int);
/// all the way through funcbase31

#define FILL_(num) fill(num, funcbase##num)
#define FILL(num) FILL_(num)

for(int i = 0; i < 32; i++)
    FILL(i);

我希望它为 0,1,2,... 和 funcbase0, funcbase1, funcbase2,... 调用 fill,但它使用 "funcbasei" 的第二个参数调用 fill 它不会每次展开我。

我想做的事情可行吗?我需要尝试什么编译器? (我使用的是 gcc 4.9.3)

你试图做的事情用宏是不可能的,因为宏在编译时展开,远早于 运行 时间和循环开始 运行ning。

但是,您可以使用函数指针数组上的 for 循环轻松地做到这一点:

typedef int(*funcbase_t)(int);
funcbase_t fbases[] = {
    funcbase0, funcbase1, funcbase2, funcbase3, ...
};

现在您可以 运行 在 fbase 数组上循环:

for(int i = 0; i < 32; i++)
    fbases[i](i);

您可以使用预处理器来执行此操作,方法是将区间递归地拆分为多个部分并为每个部分调用它。或使用 boost 中的预构建版本:

#include <boost/preprocessor/repetition/repeat.hpp>

// and in code
#define FILL_(num) fill(num, funcbase##num)
#define FILL(num) FILL_(num)
#define MACRO(z, n, text) FILL_(n);

BOOST_PP_REPEAT(4, MACRO, 0);