如何在函数中创建函数并 return 它们?
How to create functions within a function and return them?
我想创建一个 return 函数来检查给定的 int
是否在特定范围内。
因此 returned 函数应该只接受一个参数,一个 int
和 return 一个 bool
。这是必要的,因为 returned 函数作为函数指针传递给另一个函数。到目前为止,我只能这样做:
bool valueIsInBounds(int value) { return value >= 0 && value <= 100; }
int main() {
functionThatTakesAFunction(&valueIsInBounds);
}
0
和 100
显然是固定值,我想改变它。
我希望能够做的是这样的:
??? functionGenerator(int min, int max) { ??? }
int main() {
functionThatTakesAFunction(&(functionGenerator(0, 100)));
}
我知道这在其他语言中是可行的,但我不知道在 C 中如何实现。
对不起。正如评论所说,这可以 not 在可移植的 C 中实现。
您必须自己生成一些程序集以将参数 (max
& min
) 绑定到函数指针。这称为 «trampoline» 功能,并且存在多个库。这是一个:https://www.gnu.org/software/libffcall/trampoline.html
看看这个 SO post 以获得更好的解释和使用上面的 trampoline 库的示例。
由于无法在 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);
}
我想创建一个 return 函数来检查给定的 int
是否在特定范围内。
因此 returned 函数应该只接受一个参数,一个 int
和 return 一个 bool
。这是必要的,因为 returned 函数作为函数指针传递给另一个函数。到目前为止,我只能这样做:
bool valueIsInBounds(int value) { return value >= 0 && value <= 100; }
int main() {
functionThatTakesAFunction(&valueIsInBounds);
}
0
和 100
显然是固定值,我想改变它。
我希望能够做的是这样的:
??? functionGenerator(int min, int max) { ??? }
int main() {
functionThatTakesAFunction(&(functionGenerator(0, 100)));
}
我知道这在其他语言中是可行的,但我不知道在 C 中如何实现。
对不起。正如评论所说,这可以 not 在可移植的 C 中实现。
您必须自己生成一些程序集以将参数 (max
& min
) 绑定到函数指针。这称为 «trampoline» 功能,并且存在多个库。这是一个:https://www.gnu.org/software/libffcall/trampoline.html
看看这个 SO post 以获得更好的解释和使用上面的 trampoline 库的示例。
由于无法在 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);
}