C:指向内联函数的指针

bri*_*rns 11 c function-pointers inline-functions

我有一个static inline在H文件中定义的函数,并且在C文件中的某一点,我正在为该函数指定一个指针,如下所示:

foo.h中:

static inline void frobnicate(void) {
    // frobs something.
}
Run Code Online (Sandbox Code Playgroud)

foo.c的

#include "foo.h"

void execute(void (*func)(void) ) {
    func();
}

void blahBlahBlah(void) {
    execute(frobnicate);
}
Run Code Online (Sandbox Code Playgroud)

bar.c

#include "foo.h"
// ...
frobnicate();
Run Code Online (Sandbox Code Playgroud)

所以我认为这里会发生的是编译器将内联对frobnicatebar.c 的调用,但是在foo.c中,它实际上必须创建一个实现的函数frobnicate,以便它可以有一个指向它的工作指针.

任何人都可以确认我的理解是否准确,否则更正我?

Jen*_*edt 10

inline是C标准的误称之一.它的主要含义是能够将函数的定义放在头文件中,而不必在链接时处理"多重定义"问题.

在C99和C11中执行您想要实现的目标的正式方法是inline在头文件中定义,而不是static.由于您还需要发出符号,因此需要告诉编译器这应该是哪个编译单元.这样的实例化可以通过在该.c文件中声明省略inline关键字来完成.

最自然的是,您可以使用实际需要符号的.c文件.


Gov*_*rna 7

是的,你是对的.当您使用指向函数的指针时,编译器必须创建一个"独立"版本,其中代码可以作为普通函数调用.

内联函数的好处是不需要创建调用代码,并且可以使用任何其他优化来集成调用函数和内联函数.但是当你需要对函数进行常规调用时(就像你将地址称为后者一样),那些优化就不再可能了.

  • 对于许多编译器来说可能都是这样,但我无法想象为什么需要编译器这样做.即使在函数指针的情况下,也可以很容易地内联OP的示例. (2认同)