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

标签 c function pointers casting

在这里查看一些 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) 将返回一个 bool 值
  • “条件”变量是指向函数 class_to_condition 的指针,该函数将接受一个参数
  • uint16_t 是函数接受的参数类型

我不明白

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

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

最佳答案

class_to_condition 函数接受一个enum 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);

关于c - C 中的函数指针困难,int (*foo(enum int var))(int),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68183290/

相关文章:

c - 两部分 : SPIKE fuzzer: "undefined symbol: s_word"

c - 两个进程共享内存

c - 如何使用for循环从C中的文件中读取16个字节

c - 字符串编辑器(无法正常工作)

c - 是否允许对 "compatible"结构体的结构体指针进行转换和取消引用?

c - 为什么我的链表头指向头前的2项

c - 正确读取文本文件

sql - 识别何时在 SQL 查询或 PL/SQL 过程中执行函数

javascript - 为什么当调用 apply() 或 call() 时 'this' 指向函数内的 window ?

pointers - 使用指向外部结构的指针时如何使结构在其 Go 例程之外生存