通过“字符串”调用函数

时间:2011-03-17 00:49:32

标签: c

我想知道是否可以做类似的事情:

 call("MyFunction");

让它调用一个名为MyFunction的函数,而不是调用实现一个long开关或if语句。

很可能还有其他一些方法可以做到这一点,我真正想要实现的是实现IRC协议,它获取消息,并基于那些我想称之为合适的函数

我是C的新手,也是最好的做法,所以请赐教!

5 个答案:

答案 0 :(得分:4)

并非没有定义一个字符串到函数的映射表,并且(可能)某种参数传递约定,或者使用dlopen()(这被认为是非常高级的hackery)。

答案 1 :(得分:4)

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

答案 2 :(得分:2)

无法在标准C库中按字符串直接调用函数。如果它是C ++,你可以创建std::map string函数指针,但不能在C中。如果C ++不是,你可能不得不诉诸一系列strcmp一个选项。

/* 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")();
}

答案 3 :(得分:0)

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

答案 4 :(得分:0)

我不是C程序员,个人会用动态语言做IRC,但你可以做到以下几点:

使用字符串字段和函数指针创建一个结构,使用“string”创建所有函数的数组,并按字符串排序。在调用时,按字符串对数组进行二进制搜索,并在找到的结构中调用函数指针。