C ++函数指针数组:使用char赋值函数

时间:2011-02-22 12:09:11

标签: c++

我有一个像这样的函数指针数组:

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

感谢您的帮助。

4 个答案:

答案 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语言,它在运行之前编译代码,你就没有这样的功能。