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文件.
是的,你是对的.当您使用指向函数的指针时,编译器必须创建一个"独立"版本,其中代码可以作为普通函数调用.
内联函数的好处是不需要创建调用代码,并且可以使用任何其他优化来集成调用函数和内联函数.但是当你需要对函数进行常规调用时(就像你将地址称为后者一样),那些优化就不再可能了.