修改函数指针的签名

时间:2011-05-19 17:36:51

标签: c function pointers

我在这里遇到一个小问题,我有这个功能指针:

typedef void* (* funcPointer)(const void *in, int ilen, void *out, int *olen)

这个功能

void* foo1(const void *in, int ilen, void *out, int *olen)
{
   if(CONST_VALUE_1 > iLen)
      //do something
   else
      //do something else
   return whatever;
}

代码中的某处

// ...
funcPointer fpointer = foo1;
if(someArgument > SOME_OTHER_CONSTANT)
   // where foo2 is the same as foo1 except that it uses CONST_VALUE_2
   fpointer = foo2; 
bar( someVariable, anotherVariable, fpointer);
// ...

如您所见,此函数的正文中有CONST_VALUE_X。我希望能够删除常量并使用第五个参数。由于我无法修改签名,我想知道是否有事情要做,或者用每个可能的常量值复制粘贴函数...

谢谢

3 个答案:

答案 0 :(得分:1)

如果您无法修改功能签名,那么正如您所说,您将没有第五个参数!

我看到三个选项:

  1. 我想你可以把它变成其他void *个参数之一(例如定义一个包含in原始值的结构,以及“常量”值,然后传递这在in)。

  2. 在调用函数之前设置全局变量。 这是个坏主意。

  3. 您可以将此功能编写为宏,以避免复制和粘贴维护的噩梦。 这是个坏主意。

答案 1 :(得分:0)

您可以使用调用者可以临时更改的内容(例如全局变量)替换常量。

例如:

int oldLenghtLimit = LengthLimit;
... call the function ...
LengthLimit = oldLengthLimit;

并且,在函数中:

void* foo1(const void *in, int ilen, void *out, int *olen)
{
  if(LengthLimit > iLen)
    //do something
  else
    //do something else
  return whatever;
}

答案 2 :(得分:0)

您想要的是一个闭包,而C没有明确支持闭包。您可以通过修改API来携带函数指针和参数指针而不仅仅是函数指针来实现相同的功能。然后你只需要函数的版本:一个使用显式调用者提供的参数,另一个使用携带参数指针的值。