我在这里遇到一个小问题,我有这个功能指针:
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
。我希望能够删除常量并使用第五个参数。由于我无法修改签名,我想知道是否有事情要做,或者用每个可能的常量值复制粘贴函数...
谢谢
答案 0 :(得分:1)
如果您无法修改功能签名,那么正如您所说,您将没有第五个参数!
我看到三个选项:
我想你可以把它变成其他void *
个参数之一(例如定义一个包含in
原始值的结构,以及“常量”值,然后传递这在in
)。
在调用函数之前设置全局变量。 这是个坏主意。
您可以将此功能编写为宏,以避免复制和粘贴维护的噩梦。 这是个坏主意。
答案 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来携带函数指针和参数指针而不仅仅是函数指针来实现相同的功能。然后你只需要函数的版本:一个使用显式调用者提供的参数,另一个使用携带参数指针的值。