Могу ли я передать функции в качестве параметра, и функция может содержать разные аргументы? - PullRequest
0 голосов
/ 02 декабря 2010

В настоящее время я вызываю функцию следующим образом:

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 ]

2 голосов
/ 02 декабря 2010

Что вы действительно пытаетесь сделать и почему?

Подумайте о коде, где вы получаете указатель на функцию.Как ты узнаешь, как это назвать?

0 голосов
/ 02 декабря 2010

Вы можете просто использовать 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, а затем всегда вызывать его так, как если бы он принял три аргумента, и (на некоторых платформах) третий аргумент будет просто игнорироваться. Это, вероятно, не переносимо.

0 голосов
/ 02 декабря 2010

Посмотрите на va_start, va_arg, va_end.Вы не будете ограничены двумя и тремя аргументами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...