2010-08-28 71 views
3

是否有任何方法可以对字符串进行unstringify作为宏参数?我需要能够调用名称是字符串的函数。像这样:C使用宏进行Unstringification

void hello() { 
    printf("Hello, world!"); 
} 

call_func("hello"); 

我该如何实现call_func。它将在#include d的模块中,并将用于调用主c文件中的函数。如果有另外一种方法可以做到这一点,名字不一定要在字符串中,但可以作为参数传递给一个可以正常使用的函数。这就是我的意思:

#define call_func(X) X() 
void do_something(Some_kind_of_C_func_type i) { 
    call_func(i) 
} 
void hello() { 
    printf("Hello, world!"); 
} 

do_something(C_FUNC(hello)); 

回答

1

好吧,我看到两种方法来做到这一点,这取决于你的目标是什么。

首先是函数指针;基本上把一个功能看作是一个变量。有关快速概览,请参阅here

或者,您可以以共享库的方式构建想要调用的代码,然后使用类似dlopen()或LoadLibrary()的方法打开该库,然后使用任一接口访问变量/函数。

+0

函数指针正是我想要的!谢谢。 – None 2010-08-28 20:41:59

0

虽然不完全清楚你想完成什么,但不能使用宏来获取在运行时输入的字符串并解析相同名称的函数。你可以做的是,将所有函数注册到一个列表(或者稍微复杂的数据结构)中,并用他们的名字来调用它们。

#define INSERT(fn) addfn(#fn, &fn) 
void addfn(char const* name, func_t fp); 

addfn coult按照发行指针,并把它在字典中的条目name下。

+0

在适当的句柄上使用['dlsym()'](http://www.opengroup.org/onlinepubs/9699919799/functions/dlsym.html)将会起作用。我相信你需要使用['dlopen(0,0)'](http://www.opengroup.org/onlinepubs/9699919799/functions/dlopen.html)来获得合适的句柄。但是你的基本观点 - 你无法简单地做到这一点(无论是使用宏还是其他技术)都是有效的。 – 2010-08-28 23:58:19