13

static inline在 H 文件中定义了一个函数,在 C 文件中的某个位置,我为该函数分配了一个指针,如下所示:

富.h:

static inline void frobnicate(void) {
    // frobs something.
}

foo.c

#include "foo.h"

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

void blahBlahBlah(void) {
    execute(frobnicate);
}

酒吧.c

#include "foo.h"
// ...
frobnicate();

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

谁能确认我的理解是否准确,否则纠正我?

4

2 回答 2

11

inline是 C 标准的用词不当之一。它的主要含义是能够将函数的定义放在头文件中,而不必在链接时处理“多重定义”问题。

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

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

于 2012-01-16T20:17:54.053 回答
9

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

内联函数的好处是不需要创建调用代码,并且可以应用任何其他优化来集成调用函数和内联函数。但是当您需要对函数进行定期调用时(例如当您获取地址来调用它时),这些优化就不再可能了。

于 2012-01-16T20:17:12.087 回答