2010-12-02 172 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,然后随时调用它,就好像花了三个参数,并(在某些平台),第三个参数将被忽略。这可能不是便携式的。

相关问题