prev up next   top/contents search

comp.lang.c FAQ 列表· 问题 20.6

如果我有一个char *变量指向一个函数名,我该如何调用该函数?代码如

	extern int func(int, int);
	char *funcname = "func";
	int r = (*funcname)(1, 2);
	r = (*(int (*)(int, int))funcname)(1, 2);
似乎行不通。


当程序运行时,关于其函数和变量名称的信息(“符号表”)不再需要,因此可能不可用。因此,最直接的方法是自己维护该信息,使用一个包含名称和函数指针的对应表

int one_func(), two_func();
int red_func(), blue_func();

struct { char *name; int (*funcptr)(); } symtab[] = {
	"one_func",	one_func,
	"two_func",	two_func,
	"red_func",	red_func,
	"blue_func",	blue_func,
};
然后,在表中搜索名称,并通过关联的函数指针进行调用,代码如下
#include <stddef.h>

int (*findfunc(char *name))()
{
	int i;

	for(i = 0; i < sizeof(symtab) / sizeof(symtab[0]); i++) {
		if(strcmp(name, symtab[i].name) == 0)
			return symtab[i].funcptr;
		}

	return NULL;
}

...

	char *funcname = "one_func";
	int (*funcp)() = findfunc(funcname);
	if(funcp != NULL)
		(*funcp)();
可调用的函数应该都具有兼容的参数和返回类型。(理想情况下,函数指针也应该指定参数类型。)

有时程序可以读取自己的符号表,如果符号表仍然存在的话,但它必须首先能够找到自己的可执行文件(参见问题 19.31),并且它必须知道如何解释符号表(某些 Unix C 库为此目的提供了一个nlist函数)。另请参阅问题 2.1518.1419.36

参考:PCS 第 11 章 第 168 页


prev up next   contents search
关于此 FAQ 列表   关于 Eskimo   搜索   反馈   版权

Eskimo North 托管