2010-12-02 185 views
0

目前我稱這樣的功能:我可以傳遞函數作爲參數嗎?函數可以包含不同的參數?

typedef struct OptionValueStruct{ 
    const char *option_name;  
    int (*func)(char*, char**);  
} OptionValueStruct_t; 


int parse2parameter(char *opt_name, char** opt_val); 
int parse3parameter(char *opt_name, char** opt_val, int a); 


const OptionValueStruct_t option_values[] = { 
{"Counter1", parse2parameter} 
}; 

其中parse2parameter是具有其在OptionValueStruct_t定義2個參數的FUNC()。
怎麼可能我用

const OptionValueStruct_t option_values[] = { 
{"Counter1", parse2parameter}, 
{"Counter2", parse3parameter} 
}; 

凡parse2parameter()和parse3parameter()有不同數量/類型的參數?

+0

將所有這些放到代碼框中。您可以通過選擇所有代碼(首先刪除「`」),然後單擊富文本編輯器中的101010按鈕。或者,您可以在代碼和其他文本之間添加一些間距,並用4個空格縮進代碼。 – 2010-12-02 02:55:42

回答

2

你真的想做什麼,爲什麼?

想想接收函數指針的代碼。你怎麼知道如何打電話?

+0

,因爲不同的計數器需要不同的功能。 Thx – user389955 2010-12-02 02:56:24

+0

我不認爲你明白我問了什麼。 「如何」沒有回答「因爲」。 – 2010-12-02 03:32:53

+0

如何知道如何調用它的答案是在我的答案中(向結構中添加一些指示函數類型的值)。 – 2010-12-02 04:09:07

0

看看va_start,va_arg,va_end。你不會受到兩個和三個參數的限制。

0

您可以使用int(*)(),並具有其他一些描述函數簽名的參數,以便您可以調用它。例如:

typedef struct OptionValueStruct{ 
    const char *option_name; 
    int (*func)(); /* actually takes some arguments */ 
    unsigned num_args; /* might need more fields to describe the args */ 
} OptionValueStruct_t; 

...

switch (value.num_args){ 
case 2: ((int (*)(char*, char**))value.func)(opt_name, opt_val); 
case 3: ((int (*)(char*, char**, int))value.func)(opt_name, opt_val, a); 
} 

另一種方法是隻申報指針FUNC匹配parse3parameter,然後隨時調用它,就好像花了三個參數,並(在某些平臺),第三個參數將被忽略。這可能不是便攜式的。

相關問題