功能我不知道是否有可能做这样的事情:呼叫通过“串”
call("MyFunction");
,并把它称之为没有调用实现长开关或if语句的功能名为MyFunction的。
有probly是一些其他的方式来做到这一点,我真的想才达到,是落实IRC协议,该协议得到的消息,以及基于这些我想打电话给apropiate功能
我是新以C和最佳做法如何做,所以请赐教!
功能我不知道是否有可能做这样的事情:呼叫通过“串”
call("MyFunction");
,并把它称之为没有调用实现长开关或if语句的功能名为MyFunction的。
有probly是一些其他的方式来做到这一点,我真的想才达到,是落实IRC协议,该协议得到的消息,以及基于这些我想打电话给apropiate功能
我是新以C和最佳做法如何做,所以请赐教!
没有办法像标准C库一样通过字符串直接调用函数。如果它是C++,你可以创建一个std::map
的string
函数指针,但不是C.你可能不得不求助于一系列的strcmp
,如果C++不是一个选项。
/* These are your handler functions */
void user_fn() { printf("USER fn\n"); }
void pass_fn() { printf("PASS fn\n"); }
/* Stores a C string together with a function pointer */
typedef struct fn_table_entry {
char *name;
void (*fn)();
} fn_table_entry_t;
/* These are the functions to call for each command */
fn_table_entry_t fn_table[] = {{"USER", user_fn}, {"PASS", pass_fn}};
/* fn_lookup is a function that returns the pointer to the function for the given name.
Returns NULL if the function is not found or if the name is NULL. */
void (*fn_lookup(const char *fn_name))() {
int i;
if (!fn_name) {
return NULL;
}
for (i = 0; i < sizeof(fn_table)/sizeof(fn_table[0]); ++i) {
if (!strcmp(fn_name, fn_table[i].name)) {
return fn_table[i].fn;
}
}
return NULL;
}
int main() {
fn_lookup("USER")();
fn_lookup("PASS")();
}
感谢这是我在想的东西! – skyw00lker 2011-03-17 03:31:36
不是没有定义一个字符串到函数映射表(可能)某种参数传递约定,或使用dlopen()
(它算作非常先进的hackery)。
不能与C开箱。您可以有一个哈希映射或字典,其中包含字符串作为键和函数指针。您可以使用字符串键在字典中查找,然后调用函数指针。
您创建一个表,将每个字符串与函数指针相关联。然后查找表中的字符串,并通过指针调用该函数。经典的K & R文本包含类似这样的代码。
我不是一个C程序员,并亲自会做IRC的东西,在一个动态语言,但你可以做到以下几点:
创建一个字符串字段和函数指针的结构体,使数组所有函数与他们的“字符串”,按字符串排序。在调用时,通过字符串在数组上进行二分搜索,并在找到的结构中调用函数指针。
我也会,虽然这主要是为了教育目的。 – skyw00lker 2011-03-17 03:23:09
感谢所有的反馈,我想我会去tablelookup像下面的代码从user470379 – skyw00lker 2011-03-17 03:36:49
可能重复的[调用一个字符串变量在C中命名的函数](http://stackoverflow.com/ question/1118705/call-a-function-named-in-a-string-variable-in-c) – 2015-08-27 14:21:54