C中的函数指针难度,int (*foo(enum int var))(int)

min*_*ner 2 c pointers casting function

在这里查看一些 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;
}
Run Code Online (Sandbox Code Playgroud)

然后

bool (*condition)(uint16_t) = class_to_condition(class);
Run Code Online (Sandbox Code Playgroud)

然后用作

if (!condition(code)) {
Run Code Online (Sandbox Code Playgroud)

我得到:

  • class_to_condition(u16) 将返回一个布尔值
  • “condition”变量是一个指向函数 class_to_condition 的指针,这个函数将接受一个参数
  • uint16_t 是函数接受的参数类型

我不明白

  • 枚举
  • 为什么它似乎需要两个参数(有点)
  • 为什么函数定义本身就是一个指针
  • uint16_t“代码”从未在 class_to_condition() 中使用?

这是否比明显的非指针替代方案更有效,值得增加复杂性(聪明与可爱)?

dbu*_*ush 5

该函数class_to_condition将 anenum option_class作为参数并返回一个函数指针。返回的函数指针指向一个函数,该函数有一个uint16_t参数并返回一个bool.

如果我们添加以下 typedef:

typedef bool (*fptr)(uint16_t);
Run Code Online (Sandbox Code Playgroud)

我们可以将函数签名重写为:

fptr class_to_condition(enum option_class class) {
Run Code Online (Sandbox Code Playgroud)

调用如下:

fptr condition = class_to_condition(class);
Run Code Online (Sandbox Code Playgroud)