在C中可以通过函数指针调用静态函数吗?

在C中可以通过函数指针调用静态函数吗?,c,static,function-pointers,C,Static,Function Pointers,我认为源文件中的静态函数不能直接从文件外部调用。但是,如果我设法将指向此函数的指针放入另一个文件,那么我可以从该文件调用此函数。如果是,与简单地使函数成为非静态函数相比,我们是否希望采用这种方法?是的,文件中的非静态函数可以将指向静态函数的指针返回到您喜欢的任何位置 但是,如果我设法将指向此函数的指针 另一个文件,我可以从那个文件调用这个函数吗 是的,完全有可能。该函数对链接器不可见,但它位于可执行文件中。你可以随时跳转到它的地址 不过,我不确定会发生什么情况。也许您希望其他人只在调用其他函数之

我认为源文件中的静态函数不能直接从文件外部调用。但是,如果我设法将指向此函数的指针放入另一个文件,那么我可以从该文件调用此函数。如果是,与简单地使函数成为非静态函数相比,我们是否希望采用这种方法?

是的,文件中的非静态函数可以将指向静态函数的指针返回到您喜欢的任何位置

但是,如果我设法将指向此函数的指针 另一个文件,我可以从那个文件调用这个函数吗

是的,完全有可能。该函数对链接器不可见,但它位于可执行文件中。你可以随时跳转到它的地址


不过,我不确定会发生什么情况。也许您希望其他人只在调用其他函数之后才调用您的函数(当然是非静态的)。所以你让他们得到它,然后他们可以调用它。

是的,你可以。如果必须调用需要指向函数的指针作为回调的函数,则可以使用static,这样函数符号就不会污染全局命名空间,也不会导致链接器冲突。最常用的示例可能是qsort:

struct Data { ... };

static int compareData(const void* a, const void* b) { /* cast to Data and compare */ }

...
qsort(array, count, sizeof(Data), &compareData);

正如另一个提到的,你可以做到。一个你可能想要的例子是某种“驱动程序”。您可以传回包含打开、关闭、读取和写入函数的结构,而无需公开实际函数。

是的,您可以通过向静态函数发出指针来导出静态函数。这是在C中实现的常用方法,在C中,您可以对使用它们的模块隐藏整组函数的实现,并拥有一个
FuncPtr\t GetFunction(enum whichFunctionIWant)
,将它们分发给使用者。这就是实现的数量。

是的,您可以自己尝试,并发现:

文件1.c


将小型静态函数定义为其他函数的辅助函数通常很有用。以标准的
qsort
为例:它需要一个比较函数,通常最好将该比较函数设置为静态(例如,因为它在其他地方不有用,并且
qsort
希望它具有一些不恰当的签名)。

这在C语言中通常不是一个好方法。“它起作用”和“它是安全的,可以在任何地方工作,并且不依赖于未定义的行为“通常是非常不同的东西。我想知道如果你把它与
inline
关键字和/或总是内联函数的专有编译器指令混合在一起,会有什么样的行为。@mpontillo我相信即使函数被标记为
inline
,但地址是在函数指针中获取的,编译器将以二进制形式生成主体,同时将其内联到同一模块中的其他函数中。这个示例非常棒!像C++类成员函数一样的行为。哎呀
#include <stdio.h>

void call_hello(void (*fptr)(void));

static void hello(void) {
   puts("hello");
}

int main(void)
{
   void (*fptr)(void) = hello;

   call_hello(fptr);

   return 0;
}
void call_hello(void (*fptr)(void))
{
   fptr();
}