2011-03-17 159 views
1

功能我不知道是否有可能做这样的事情:呼叫通过“串”

call("MyFunction"); 

,并把它称之为没有调用实现长开关或if语句的功能名为MyFunction的。

有probly是一些其他的方式来做到这一点,我真的想才达到,是落实IRC协议,该协议得到的消息,以及基于这些我想打电话给apropiate功能

我是新以C和最佳做法如何做,所以请赐教!

+0

感谢所有的反馈,我想我会去tablelookup像下面的代码从user470379 – skyw00lker 2011-03-17 03:36:49

+0

可能重复的[调用一个字符串变量在C中命名的函数](http://stackoverflow.com/ question/1118705/call-a-function-named-in-a-string-variable-in-c) – 2015-08-27 14:21:54

回答

2

没有办法像标准C库一样通过字符串直接调用函数。如果它是C++,你可以创建一个std::mapstring函数指针,但不是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")(); 
} 
+0

感谢这是我在想的东西! – skyw00lker 2011-03-17 03:31:36

4

不是没有定义一个字符串到函数映射表(可能)某种参数传递约定,或使用dlopen()(它算作非常先进的hackery)。

4

不能与C开箱。您可以有一个哈希映射或字典,其中包含字符串作为键和函数指针。您可以使用字符串键在字典中查找,然后调用函数指针。

0

您创建一个表,将每个字符串与函数指针相关联。然后查找表中的字符串,并通过指针调用该函数。经典的K & R文本包含类似这样的代码。

0

我不是一个C程序员,并亲自会做IRC的东西,在一个动态语言,但你可以做到以下几点:

创建一个字符串字段和函数指针的结构体,使数组所有函数与他们的“字符串”,按字符串排序。在调用时,通过字符串在数组上进行二分搜索,并在找到的结构中调用函数指针。

+0

我也会,虽然这主要是为了教育目的。 – skyw00lker 2011-03-17 03:23:09