我在H文件中定义了一个static inline
函数,在C文件中的某个点上,我为该函数分配了一个指针,类似于以下内容:
foo.h:
static inline void frobnicate(void) {
// frobs something.
}
foo.c
#include "foo.h"
void execute(void (*func)(void) ) {
func();
}
void blahBlahBlah(void) {
execute(frobnicate);
}
bar.c
#include "foo.h"
// ...
frobnicate();
所以我认为这里会发生的是,编译器将从bar.c内联对frobnicate
的调用,但在foo.c中,它实际上必须创建一个函数来实现frobnicate
,这样它就可以有一个指向它的工作指针
有人能确认我的理解是否准确吗?否则就纠正我吗?
inline
是C标准的误称之一。它的主要含义是能够将函数的定义放在头文件中,而不必在链接时处理"多重定义"问题。
C99和C11中实现您想要实现的目标的官方方法是在头文件中包含inline
定义,而不包含static
。由于您还需要发出符号,因此需要告诉编译器这应该在哪个编译单元中。这样的实例化可以通过在.c文件中省略inline
关键字的声明来完成。
最自然的是,您可以在实际需要符号的地方使用.c文件。
内联函数的好处是不需要创建调用代码,并且可以使用任何其他优化来集成调用方函数和内联函数。但是,当您需要对函数进行常规调用时(例如,当您获取地址后再调用它时),这些优化就不可能了。