基于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);
我有一个函数,它接受一个指向函数的指针作为参数。 由于函数指针名称的相似性质,此函数在 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);