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

Ank*_*rVj 29 c static function-pointers

我认为源文件中的静态函数不能直接从文件外部调用.但是,如果我以某种方式设法将指向此函数的指针转换为另一个文件,那么我可以从该文件中调用此函数.如果是的话,是否有任何情况我们想要采用这种方式而不是简单地使函数非静态?

Cra*_*rks 32

是的,您可以通过分发指向它们的指针来导出静态函数.这是在C 中实现Factory模式的常用方法,您可以从使用它们的模块中隐藏一大堆函数的实现,并将FuncPtr_t GetFunction( enum whichFunctionIWant)它们交给消费者.这就是有多少动态链接实现工作.


cni*_*tar 9

但是,如果我以某种方式设法将指向此函数的指针转换为另一个文件,那么我可以从该文件中调用此函数.

是的,这是完全可能的.该功能对链接器不可见,但它位于可执行文件中.您可以随时跳转到其地址.

我不确定方案.也许你希望别人在调用其他函数(当然是非静态函数)之后才调用你的函数.所以你让他们获得它,然后他们可以调用它.


Ric*_*ton 6

正如另一个提到的,你可以做到。您可能想要的一个例子是某种“驱动程序”。您可以传回一个包含 open、close、read 和 write 函数的结构,而不必使实际函数可公开访问。


zeu*_*xcg 5

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

struct Data { ... };

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

...
qsort(array, count, sizeof(Data), &compareData);
Run Code Online (Sandbox Code Playgroud)