C++函数指针数组:使用字符分配函数

3

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

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个回答

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)
};

上面的代码尚未编译,但应该至少接近正确。
更新:我在宏旁边添加了一个注释来解释一下。 #和##运算符有点晦涩,但是完全标准,众所周知,并且在这些情况下始终出现。
#是引用或字符串化运算符。
##是记号连接运算符。

"{ #n, func_##n }" 这是什么意思?你能指出一些参考资料,让我了解这个吗?我了解基本的宏定义,但不确定它在这里是如何使用的。 - Shamim Hafiz - MSFT
@Gunner:第一个将名称字符串值创建出来,第二个则是连接。也就是说,如果n是run,那么它分别变成了"run"和func_run - Nawaz

1

那是不可能的。

函数在运行时无法通过名称访问,因为编译器将名称转换为内存地址。


0

这在原始的C++中是不可能的。


0
像 PHP 这样的脚本语言具有这种功能,因为它们是解释性语言。对于像 C 这样在运行之前编译代码的语言,您就没有这样的功能。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接