gpt4 book ai didi

c - 违反C中的静态函数

转载 作者:太空狗 更新时间:2023-10-29 17:15:01 25 4
gpt4 key购买 nike

在一次采访中有人问我,如果在一个文件 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com