目前我以这种方式调用函数:
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()在哪里有不同数量/类型的参数?
答案 0 :(得分:2)
你真正想做什么,为什么?
考虑接收函数指针的代码。你怎么知道怎么称呼它?
答案 1 :(得分:0)
查看va_start
,va_arg
,va_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
,然后总是将其称为三个参数,并且(在某些平台上),第三个参数将被忽略。这可能不是便携式的。