违反C中的静态功能

ros*_*ose 6 c static

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

我的答案是:

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

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

能否请你提供一些更好的违规解决方案static.

Tho*_*thy 9

也许他们想听听功能指针?

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

这是合理的一种可能情况是,如果你有一个你不想被所有人调用的回调函数,你将指针作为某个register_callback函数的参数.

回调函数被广泛使用,例如让GUI API的用户提供按下按钮时应该发生的代码.现在,对于面向对象的语言,更常见的是对类进行子类化并定义或覆盖方法,例如Android View类和方法OnClickListener,但C#委托与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();
}
Run Code Online (Sandbox Code Playgroud)

此标头some_library.h文件显示该库的API:

extern void register_callback(void (*callback)(void));
extern void do_stuff(void);
Run Code Online (Sandbox Code Playgroud)

这里是如何使用库(问题中的文件"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;
}
Run Code Online (Sandbox Code Playgroud)

  • 您如何确定要呼叫的功能的地址? (3认同)

Pau*_*vie 8

我的采访答案是"你做不到".

(因为问题说"在文件B中你想使用这个静态函数"并且它没有说你被允许修改文件A.)

  • @Jens-Gustedt,如果以一种或另一种方式导出函数的指针,编译器将不再内联函数.这也意味着修改文件A,因此解决方案应该是删除`static`关键字.所有其他指针的东西都没用了.如果这是一个回调函数,那么`register_callback`函数应该在文件A中,然后静态函数可以保持静态.添加`register_callback`再次修改文件A,因此这不是一个回调.结论:"你做不到." (2认同)