C语言回调中可以使用extern函数指针吗?

标签 c callback extern

我正在研究c语言的回调。在示例中,函数指针作为参数传递给下游函数,下游函数又用于“回调”上游函数。它可以作为外部变量而不是参数传递吗?

我尝试通过谷歌搜索将函数指针作为 extern 传递,但没有找到任何相关内容。可能有充分的理由(即,它要么是糟糕的编码,要么不起作用,要么就是愚蠢)。

/* 回调.c */

#include<stdio.h>
#include"reg_callback.h"

/* callback function definition goes here */
void my_callback(void)
{
    printf("inside my_callback\n");
}

int main(void)
{
    /* initialize function pointer to
    my_callback */
    callback ptr_my_callback=my_callback;                           
    printf("This is a program demonstrating function callback\n");
    /* register our callback function */
    register_callback(ptr_my_callback);                             
    printf("back inside main program\n");
    return 0;
}

/* reg_callback.h */


typedef void (*callback)(void);
void register_callback(callback ptr_reg_callback);

/* reg_callback.c */


#include<stdio.h>
#include"reg_callback.h"

/* registration goes here */
void register_callback(callback ptr_reg_callback)
{
    printf("inside register_callback\n");
    /* calling our callback function my_callback */
    (*ptr_reg_callback)();                                  
}

这按预期工作。它产生以下输出:

This is a program demonstrating function callback
inside register_callback
inside my_callback
back inside main program

使用存储在 extern 变量中的函数指针而不是将其作为参数传递来完成同样的事情吗?

谢谢 基尔

最佳答案

Could the same thing have been accomplished using an function pointer stored in extern variable instead of passing it as argument?

是的,在您的简单示例中。重要的是指针,而不是将值传送到其使用点的机制。

但在现实世界的回调情况下,通常不可能依赖外部变量在调用回调时仍然保留所需的值,因为其值可能会在调用回调期间被修改。此外,回调接口(interface)通常旨在支持涉及单独组件的通信模式,这样就无法通过共享约定来了解要使用哪个外部变量。

总体而言,外部(又称“全局”)变量具有不好的代码味道,对于比玩具和快速一次性的程序或库来说很少是一个好的解决方案。

关于C语言回调中可以使用extern函数指针吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57420985/

相关文章:

c++ - 在两个 cpp 文件的 header 中共享定义的全局变量

c - 如何使用函数在 header 中声明并在源代码中定义的结构

c - 将 unsigned long 数据类型写入二进制文件

C多个文件,打印数组的段错误

c - 如何从函数返回结构数组?

执行 'n' 异步回调后,node.js 执行函数

c++ - C++ 是否允许优化编译器忽略对 for 条件的副作用?

javascript - 连续调用 angular2 的回调

javascript - 如何在高阶函数中进行没有返回值的回调

c++ - extern 必须有权访问类构造函数吗?