【发布时间】:2013-09-10 12:14:57
【问题描述】:
声明为静态的函数和变量具有内部链接,并且它们具有文件范围,并且它们对其他文件中的函数不可见。
假设我声明一个这样的函数:-
static int foo(int i);
在一个名为 file1.c 的文件中 我可以通过使用指针从其他文件file2.c访问这个函数吗?
我正在浏览一本书,书中写到它可以做到,但我不知道这怎么可能。
这些是确切的行:-
因为它有内部链接,所以不能直接调用 foo 在定义它的文件之外。(将 foo 声明为静态不会 完全防止它在另一个文件中被调用;间接的 仍然可以通过函数指针调用)。
【问题讨论】:
-
如果您想从其他编译单元访问该函数,那么您为什么要首先使用
static? -
@Jon:您可以将回调声明为静态(没有其他人可以通过其标识符调用该函数),并将其指针发送到设置函数以对事件作出反应。你强迫它成为一个回调函数,而不是像一个普通的那样调用。
-
@Gauthier:在这种情况下,您只需将地址传递给被调用者:
takes_callback(foo)- 我看到您已经建议了。 OP 要求(正如我和其他回答的人看到的那样)提供一个全局可访问的函数指针,这完全没有意义。当然,这并不妨碍人们回答 moar rep... 的字面问题 -
只有拥有静态函数的模块从不改变指针的值,这完全没有意义。但是拥有模块可以在内部做出复杂的决定,并改变例如在调用指针时运行哪个版本的算法(对于调用模块是透明的)。
-
static与“范围”无关,无论是函数还是对象。问题中对“范围”的提及具有误导性。标识符的范围取决于在哪里声明它并且完全独立于任何声明说明符(如static)。