可能的重复:
在 c 中调用以字符串变量命名的函数
我有某些功能..比如说,
double fA1B1C1( .. ) {
...
}
double fA2B2C3( .. ) {
...
}
double (*fptr)( .. );
fptr myfunc;
这些函数已经定义了。
因此,当用户输入字符串“A2B2C2”时,它会被放入变量中并转换为“fA2B2C2”
myfunc = formatted_string; // DOES NOT WORK
但是上面的语法不起作用。即使打字也不起作用。
myfunc = (fptr) formatted_string // DOES NOT WORK
但是如果我将其硬编码为
myfunc = fA2B2C2
(或)myfunc = &fA2B2C2
,效果很好。
我哪里出错了?
编辑::
I tried creating a hash table and a lookup function. Like
create_hashEntry(hashtable, string, formatted_string);
// string = "A1B1C1; formatted_string = "fA1B1C1"
然后是查找功能
myfunc lookup_func(char *string) {
return(get_hashEntry(hahstable, string));
}
这也失败了。
实际上,如果功能是
extern
,你能不使用一些超级邪恶的动态加载器技巧来做到这一点吗?
阅读重复内容,您会找到答案。
不过,我想补充一点,这是由于对程序工作原理的误解。
这些函数位于内存中的地址。字符串不是地址。代码中的函数名称与其地址同义。在运行时,拥有一个字符串实际上只是拥有一个指向内存中某个包含字符的位置的指针。这与编译时完成的任何操作(例如函数名称)无关。
某些语言包含有关程序的元数据,这意味着它们do在运行时携带有关函数、函数名称、参数等的信息。 C++ 不是这些语言之一。
这就是为什么大多数答案将是对这种元数据的模拟:函数将被存储,并且在运行时您可以使用字符串来查看表。
在 C 中你无法将字符串转换为函数指针。你必须检查字符串的内容来确定使用哪个函数。
C 中的字符串是指向字符数组的指针,函数指针是指向某些可执行机器代码的指针。您可以通过简单的类型转换将一种转换为另一种,它们是完全不同的东西。