c - 违反C中的静态函数

标签 c static

在一次采访中有人问我,如果在一个文件 A 中定义了一些静态函数,而在文件 B 中你想使用这个静态函数——你将如何使用它?

我的回答是:

  1. 在.h文件中声明 但是,如果我们在头文件中声明它,那么包含它的其他文件也可以访问这个静态函数。
  2. 包装概念:在文件A中声明一个新函数newfun,它将调用静态函数并在文件B中调用这个newfun

但他对这些答案并不满意。

能否请您提供一些更好的解决方案来违反static

最佳答案

也许他们想听听函数指针?

您可以创建一个指向该函数的指针,并使用该指针调用它。

这是合理的一种可能情况是,如果您有一个回调函数,您不希望每个人都可以调用它,并且您将指针作为参数提供给某个 register_callback 函数。

回调函数被广泛使用,例如,让 GUI API 的用户提供代码,说明按下按钮时应该发生什么。如今,对于面向对象的语言,更常见的是对类进行子类化并定义或重写方法,例如 Android View 类和方法 OnClickListener,但是 C# 委托(delegate)与 C 函数指针非常相似。

为了说明原理,这里是某种库的源代码(原问题中的文件“B”),其中主要组件是do_stuff函数:

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

void (*stored_callback)(void) = NULL;

void register_callback(void (*callback)(void)) {
    stored_callback = callback;
}

void do_stuff(void) {
    printf("Doing stuff...\n");
    printf("Calling callback...\n");
    if (stored_callback != NULL)
        stored_callback();
}

这个 header ,some_library.h,文件显示了那个库的 API:

extern void register_callback(void (*callback)(void));
extern void do_stuff(void);

下面是库的使用方式(问题中的文件“A”):

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

static void my_callback(void) {
    printf("Inside the callback!\n");
}

int main(void) {
    register_callback(my_callback);
    do_stuff();
    return 0;
}

关于c - 违反C中的静态函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32991707/

相关文章:

c - 缩放位图图像出现段错误

c - 为什么C程序中调用线程数比执行线程数多?

java - 这个匿名类对象什么时候被创建和访问,什么时候被垃圾回收?

linux - 在访问权限非常有限的不同 Linux 机器上安装程序

为给定范围创建一次复合文字

c - 如何使用 cJSON 读取字符串

c - C 中的字符串转换对性能有何影响?

c# - 静态变量实例和 AppDomains,发生了什么?

c - 未找到静态字符数组且无法与 strncpy 一起使用?

c++ - 从函数返回指向局部变量的静态指针