我可以将函数作为参数传递,函数可以包含不同的参数吗?

时间:2010-12-02 02:34:07

标签: c

目前我以这种方式调用函数:

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是一个func(),有2个参数,在OptionValueStruct_t中定义。
我怎么可能用

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

parse2parameter()和parse3parameter()在哪里有不同数量/类型的参数?

3 个答案:

答案 0 :(得分:2)

你真正想做什么,为什么?

考虑接收函数指针的代码。你怎么知道怎么称呼它?

答案 1 :(得分:0)

查看va_startva_argva_end。你不会受到两个和三个论点的限制。

答案 2 :(得分: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,然后总是将其称为三个参数,并且(在某些平台上),第三个参数将被忽略。这可能不是便携式的。