C 通过“字符串”调用函数
我想知道是否有可能这样做:C 通过“字符串”调用函数,c,C,我想知道是否有可能这样做: call("MyFunction"); 并让它调用名为MyFunction的函数,而不让调用实现长开关或if语句 可能还有其他方法可以做到这一点,我真正想要实现的是实现IRC协议,它获取消息,并基于这些消息,我想调用apropiate函数 我对C和最佳实践都是新手,所以请启发我 没有定义字符串到函数的映射表,可能还有某种参数传递约定,或者使用dlopen,这算是非常高级的黑客技术。没有定义字符串到函数的映射表,可能还有某种参数传递约定,或者使用dlopen,这算是
call("MyFunction");
并让它调用名为MyFunction的函数,而不让调用实现长开关或if语句
可能还有其他方法可以做到这一点,我真正想要实现的是实现IRC协议,它获取消息,并基于这些消息,我想调用apropiate函数
我对C和最佳实践都是新手,所以请启发我 没有定义字符串到函数的映射表,可能还有某种参数传递约定,或者使用dlopen,这算是非常高级的黑客技术。没有定义字符串到函数的映射表,可能还有某种参数传递约定,或者使用dlopen,这算是非常高级的黑客行为。不是C现成的。你可以有一个哈希映射或字典,其中字符串作为键和函数指针。您可以使用字符串键在字典中查找,然后调用函数指针。不是C现成的。您可以使用哈希映射或字典,将字符串作为键和函数指针。您可以使用string键在字典中查找,然后调用函数指针。无法像在标准C库中那样直接按字符串调用函数。如果是C++,可以创建一个字符串为函数指针的STD::MAP,但在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")();
}
在标准C库中,无法像您希望的那样通过字符串直接调用函数。如果是C++,可以创建一个字符串为函数指针的STD::MAP,但在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")();
}
创建一个表,将每个字符串与函数指针关联起来。然后在表中查找字符串,并通过指针调用函数。经典的K&R文本包含类似这样的代码。您可以创建一个表,将每个字符串与函数指针关联起来。然后在表中查找字符串,并通过指针调用函数。经典的K&R文本包含类似这样的代码。我不是C程序员,我个人会用动态语言编写IRC,但您可以执行以下操作:
创建一个包含字符串字段和函数指针的结构,用字符串创建一个包含所有函数的数组,按字符串排序。调用时,按字符串对数组进行二进制搜索,并在找到的结构中调用函数指针。我不是C程序员,个人会用动态语言进行IRC操作,但您可以执行以下操作:
创建一个包含字符串字段和函数指针的结构,用字符串创建一个包含所有函数的数组,按字符串排序。调用时,按字符串对数组进行二进制搜索,并在找到的结构中调用函数指针。我也会这样做,尽管这主要是出于教育目的。我也会这样做,尽管这主要是出于教育目的。感谢所有反馈,我想我会使用tablelookup,类似于下面来自User470379的代码可能重复感谢所有反馈,我想我会使用tablelookup,类似于下面来自User470379的代码可能重复