功能我不知道是否有可能做這樣的事情:呼叫通過「串」
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