2011-03-17 153 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