如何在函数中创建函数并返回它们?

时间:2016-12-19 12:52:34

标签: c function function-pointers

我想创建一个函数,该函数返回一个函数,用于检查给定int是否在某些范围内。 因此,返回的函数应该只接受一个参数int,并返回bool。这是必要的,因为返回的函数作为函数指针传递给另一个函数。到目前为止,我只能这样做:

bool valueIsInBounds(int value) { return value >= 0 && value <= 100; }

int main() {
    functionThatTakesAFunction(&valueIsInBounds);
}

0100显然是固定值,我想改变它。
我希望能做的是这样的事情:

??? functionGenerator(int min, int max) { ??? }

int main() {
    functionThatTakesAFunction(&(functionGenerator(0, 100)));
}

我知道这在其他语言中是可行的,但我不知道如何在C中实现这一目标。

2 个答案:

答案 0 :(得分:4)

对不起。正如评论所说,这可以在便携式C中实现。

您必须自己生成一些程序集,以将参数(max&amp; min)绑定到函数指针。这被称为“蹦床”功能,并且存在多个库。这是一个:https://www.gnu.org/software/libffcall/trampoline.html

请查看此SO post以获得更好的解释以及使用上述蹦床库的示例。

答案 1 :(得分:4)

由于动态生成函数不能在C中完成,下一个最好的方法是参数化函数。

您可以将边界作为附加参数传递(如您的问题),或者您可以使用这些边界设置全局变量或静态变量。

bool valueIsInBounds(int value, int min, int max) { return value >= min && value <= max; }

int main() {
    functionThatTakesAFunction(valueIsInBounds);
}

或:

int gMin, gMax;
void setBounds(int min, int max) { gMin= min; gMax= max; }
bool valueIsInBounds(int value)  { return value >= gMin && value <= gMax; }

int main() {
    setBounds(0, 100);
    functionThatTakesAFunction(valueIsInBounds);
}
相关问题