Методы указателя на функцию для переноса произвольных функций в c - PullRequest
1 голос
/ 27 апреля 2011

В c есть очень простой способ обернуть функцию (для синхронизации / регистрации / и т. Д.) с макросом

#define WRAP(func,args) \
...
func args /*call function with args num of args irrelavent*/         \
...

WRAP (some_func (arga_a, arg_b)) поскольку он расширяется до «func (args)»

Но со временем вы устали от недостатков макросов.

Есть ли способ сделать это простым способом с помощью функции, получающей указатель на функцию? Важно, чтобы она соответствовала функции с любым числом аргументов (ну, мы можем сказать меньше 7, если она поддерживает 0-6 аргументов. И без изменения функции.

Ответы [ 4 ]

2 голосов
/ 27 апреля 2011

Я не думаю, что вы можете иметь переменный указатель на функцию.Возможное решение состоит в том, чтобы использовать указатель на функцию, который принимает аргумент «cookie», который можно использовать для передачи вашей собственной структуры, имеющей все обязательные поля.

Прототип будет выглядеть следующим образом:

void (myFunc*)(void * cookieP);

Но у этого есть недостаток, чтобы потерять набор аргументов функции, и вам нужно будет привести параметр ...

2 голосов
/ 27 апреля 2011

В С, нет.Невозможно объявить или вызвать «произвольный» указатель на функцию (т. Е. С произвольным прототипом).

Лучшее, что вы можете сделать, - это использовать функции с переменными числами.

1 голос
/ 27 апреля 2011

Похоже на этот вопрос : либо продолжайте использовать MACROS, либо пропустите все свои дополнительные аргументы через структуру (таким образом превращая вашу функцию в «метод»)

0 голосов
/ 17 августа 2012

Как насчет старого доброго void*?

#include<stdio.h>

int bla(int a){ //some random function
  return a+1;
}

int main(){
  void* ptr; //void* aka universal pointer
  int lol; //result goes here
  ptr = &bla; //pointer to function
//return_value = ( (cast_to_function_type) (pointer_to_function) )  (argument_or_arguments);
  lol = ( (int(*)(int)) (ptr) )  (1);
  printf("%d\n", lol); //print the result
  return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...