我有一个像这样的函数指针数组:
void (*aCallback[10])( void *pPointer );
我正在为数组分配函数:
aCallback[0] = func_run;
aCallback[1] = func_go;
aCallback[2] = func_fly;
“run”,“go”,“fly”等名称存储在另一个数组中。 是否可以使用char将函数分配给函数数组?类似的东西:
char sCallbackName[64];
sprintf(sCallbackName, "func_%s", "run");
aCallback[0] = sCallbackName; //caCallback[0] = "func_run"; doesn't work of course
感谢您的帮助。
答案 0 :(得分:4)
不直接,不。符号表和其他元信息通常在运行时不可用,C ++是一种编译语言。
解决这个问题的典型方法是使用一些宏观技巧,也许是这样的:
/* Define a struct literal containing the string version of the n parameter,
* together with a pointer to a symbol built by concatenating "func_" and the
* n parameter.
*
* So DEFINE_CALLBACK(run) will generate the code { "run", func_run }
*/
#define DEFINE_CALLBACK(n) { #n, func_##n }
const struct
{
const char* name;
void (*function)(void *ptr);
} aCallback[] = {
DEFINE_CALLBACK(run),
DEFINE_CALLBACK(go),
DEFINE_CALLBACK(fly)
};
上面的代码尚未编译,但至少应该关闭。
更新:我在宏旁边添加了一条评论来解释一下。 #
和##
运算符是半模糊的,但完全标准,众所周知,并且在这种情况下它们的使用总是会出现。
答案 1 :(得分:1)
这是不可能的。
在运行时,名称无法访问这些函数,因为编译器会将名称转换为内存地址。
答案 2 :(得分:0)
这在vanilla C ++中是不可能的。
答案 3 :(得分:0)
像PHP这样的脚本语言具有这种功能,因为它们是解释语言。使用C语言,它在运行之前编译代码,你就没有这样的功能。