我们有两份文件,富.c和wine 吧.C
这是福.C
#include <stdio.h>
volatile unsigned int stop_now = 0;
extern void bar_function(void);
int main(void)
{
while (1) {
bar_function();
stop_now = 1;
}
return 0;
}
现在,这里是wine 吧.C
#include <stdio.h>
extern volatile unsigned int stop_now;
void bar_function(void)
{
if (! stop_now) {
printf("Hello, world!\n");
sleep(30);
}
}
正如您所看到的,我们在foo.c和bar.c之间没有共享头,但是bar.c在链接时需要在foo.c中声明一些内容,而foo.c在链接时需要一个来自bar.c的函数.
100
如果您需要在模块之间共享一些全局信息,并且不想将其放入/初始化标头,那么它非常有用.
从技术上讲,库公共头中的每个函数都是"extern",但是根据编译器的不同,将它们标记为extern几乎没有什么好处.大多数编译器都可以自己解决这个问题.正如你所见,这些函数实际上是在其他地方定义的.
在上面的示例中,main()将只打印hello world一次,但会继续输入bar_function().还要注意,在本例中不会返回bar_function()(因为它只是一个简单的示例).试想一下,如果这看起来不够实用,那么当一个信号被服务(因此,是易失性的)时,STOP_NOW会被修改.
外部数对于信号处理程序、您不想放在头或 struct 中的互斥体等非常有用.大多数编译器都会进行优化,以确保它们不会为外部对象保留任何内存,因为它们知道它们将在定义对象的模块中保留内存.然而,同样,在构建公共函数的原型时,使用现代编译器指定它也没有什么意义.
希望这能有所帮助:)