我在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
,以便它可以有一个指向它的工作指针。
任何人都可以确认我的理解是否准确,否则请更正我?
答案 0 :(得分:10)
inline
是C标准的误称之一。它的主要含义是能够将函数的定义放在头文件中,而不必在链接时处理“多重定义”问题。
C99和C11中要实现的目标是在头文件中定义inline
,而不是static
。由于您还需要发出符号,因此需要告诉编译器这应该是哪个编译单元。这样的实例化可以通过在.c文件中包含声明来完成,其中省略了inline
关键字。
大多数情况下,您可以使用实际需要符号的.c文件。
答案 1 :(得分:7)
是的,你是对的。当您将指针指向函数时,编译器必须创建一个“独立”版本,其中代码可以作为普通函数调用。
内联函数的好处是不需要创建调用代码,并且可以使用任何其他优化来集成调用函数和内联函数。但是当你需要对函数进行常规调用时(就像你将地址称为后者一样),那些优化就不再可能了。