C中的函数指针难度,int(*foo(enumintvar))(int)
在这里查看一些 OSCORE 代码:https : //github.com/Fraunhofer-AISEC/uoscore-uedhoc/blob/main/modules/oscore/src/option.c并且在第 31 和 63 行有一些不寻常的转换和指针函数我可以使用帮助的工作。
bool (*class_to_condition(enum option_class class))(uint16_t code)
{
switch (class) {
case CLASS_I:
return is_class_i; //is_class_x() returns bool
case CLASS_E:
return is_class_e;
default:
break;
}
return false;
}
然后
bool (*condition)(uint16_t) = class_to_condition(class);
然后用作
if (!condition(code)) {
我得到:
- class_to_condition(u16) 将返回一个布尔值
- “condition”变量是一个指向函数 class_to_condition 的指针,这个函数将接受一个参数
- uint16_t 是函数接受的参数类型
我不明白
- 枚举
- 为什么它似乎需要两个参数(有点)
- 为什么函数定义本身就是一个指针
- uint16_t“代码”从未在 class_to_condition() 中使用?
这是否比明显的非指针替代方案更有效,值得增加复杂性(聪明与可爱)?
回答
该函数class_to_condition将 anenum option_class作为参数并返回一个函数指针。返回的函数指针指向一个函数,该函数有一个uint16_t参数并返回一个bool.
如果我们添加以下 typedef:
typedef bool (*fptr)(uint16_t);
我们可以将函数签名重写为:
fptr class_to_condition(enum option_class class) {
调用如下:
fptr condition = class_to_condition(class);