【问题标题】:How to assign address of function pointer according to char*?如何根据char*分配函数指针的地址?
【发布时间】:2010-10-16 22:14:57
【问题描述】:

我正在编写一个可以简化的 C 程序,如果我能做到这样的事情:

int (*func)(int);
char* str= "adder";
func = str;
func(2);

我创建了一个函数指针,一个 char*,并尝试通过该 char* 将函数的名称分配给指针。在本例中,存在 adder(int) 函数。

这真的可能吗?

我知道这样做的标准方法就是 func = adder;,但这并不能解决问题。

非常感谢!

安东尼奥

【问题讨论】:

  • 有些东西可以让你接近这一点,但你不能,比如说,用一个字符串来定义要按名称调用的函数。如果您告诉我们您真正想做的事情(核心问题),也许我们可以帮助您找到正确的解决方案。
  • 你好马克,我基本上是想根据传递给主函数的参数来调用一个函数。我知道我可以用条件结构进行比较和检查,但我希望我能以更有效的方式来做。谢谢你的回答:)
  • 感谢大家这么快的回答。我已经意识到这不是我可以像在我提供的 sn-p 中那样容易完成的事情,我将尝试使用 R.. 下面显示的映射技术。再次感谢您的帮助!! :)

标签: c function-pointers


【解决方案1】:

你做一个这样的表:

static const struct {
    char *name;
    int (*func)(int);
} map[] = {
    { "adder", adder },
    /* ... */
    { 0, 0 }
}

然后使用这段代码:

for (i=0; map[i].name && strcmp(map[i].name, str); i++);
if (map[i].func) y = map[i].func(x);
else /* ... */

【讨论】:

  • 非常感谢您的回答,我认为这引导我朝着正确的方向前进
【解决方案2】:

这与我认为你认为它应该做的不同。如果您设法将"adder" 转换为函数指针,那么您将尝试将实际文本作为函数执行,而不是您想要的。您可以保留函数指针数组,也可以保留文本→函数指针的映射。除此之外,我们需要更多关于你在做什么的信息。

【讨论】:

  • 我实际上是在尝试根据传递给程序的参数调用一个函数,而没有使用 switch 结构检查不同的可能性
【解决方案3】:

我知道的最好方法是将您的函数放入动态库中并使用dlsym 或您的操作系统等效项来获取您的函数指针。或者,您必须以某种方式设置自己的从字符串到函数指针的映射。

【讨论】:

  • 感谢您的回答,我会考虑设置地图
【解决方案4】:

您可以使用 Windows 中的 dll 和 getprocaddress 函数来完成类似的操作,但您只能使用具有相同签名的函数或保留某种类型的精细映射。但是,您尝试做的事情需要额外的基础设施。如果您使用 c++,您可以使用映射来存储字符串和 fnptrs 之间的关系。

【讨论】:

  • 感谢您的回答,但我在 UNIX 中使用纯 C 语言进行编程
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-01-16
  • 2012-02-23
  • 1970-01-01
  • 2022-11-22
  • 2018-01-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多