用于包装c中任意函数的函数指针技术

时间:2011-04-27 11:07:06

标签: c

在c中有一种非常简单的方法来包装函数(用于计时/记录/等) 用宏

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

WRAP(some_func,(arga_a,arg_b)) 因为它扩展到“func(args)”

但最终你厌倦了宏的缺点。

有没有办法以函数指针的方式以简单的方式执行此操作?重要的是,它适用于具有任意数量参数的函数(如果它支持0-6个参数,我们可以说少于7个。并且不更改函数。

4 个答案:

答案 0 :(得分:2)

在C中,没有。无法声明或调用“任意”函数指针(即具有任意原型的指针)。

你能做的最好的就是使用可变函数。

答案 1 :(得分:1)

我认为你不能拥有可变参数函数指针。 一个可能的解决方案是使用一个函数指针,它带有一个“cookie”参数,您可以使用该参数传递具有所有必需字段的自己的结构。

原型如下:

void (myFunc*)(void * cookieP);

但是这有一个缺点,就是松开函数参数的输入,你需要转换参数......

答案 2 :(得分:1)

看起来类似于this question:继续使用MACROS,或者通过结构传递所有额外的args(从而将您的函数转换为“方法”)

答案 3 :(得分:0)

好老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;
}