我想知道是否可以做类似的事情:
call("MyFunction");
让它调用一个名为MyFunction的函数,而不是调用实现一个long开关或if语句。
很可能还有其他一些方法可以做到这一点,我真正想要实现的是实现IRC协议,它获取消息,并基于那些我想称之为合适的函数我是C的新手,也是最好的做法,所以请赐教!
答案 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”创建所有函数的数组,并按字符串排序。在调用时,按字符串对数组进行二进制搜索,并在找到的结构中调用函数指针。