在C中,我没有注意到任何影响extern
在函数声明之前使用关键字。
起初,我认为在定义时extern int f();
在单个文件中forces您可以在文件范围之外实现它。然而我发现两者:
extern int f();
int f() {return 0;}
and
extern int f() {return 0;}
编译得很好,没有来自 gcc 的警告。我用了gcc -Wall -ansi
;它甚至不接受//
评论。
使用有什么影响吗extern
在函数定义之前?或者它只是一个可选关键字,对函数没有副作用。
在后一种情况下,我不明白为什么标准设计者选择在语法中添加多余的关键字。
EDIT:为了澄清一下,我知道有用途extern
在变量中,但我只是问extern
in 功能.
我们有两个文件,foo.c 和 bar.c。
这是 foo.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;
}
现在,这是 bar.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 中的函数。
通过使用“extern”,您可以告诉编译器,它后面的任何内容都将在链接时找到(非静态);不要在当前通道中为其保留任何内容,因为稍后会遇到它。在这方面,函数和变量受到同等对待。
如果您需要在模块之间共享一些全局变量并且不想将其放入/初始化标头中,那么它非常有用。
从技术上讲,库公共标头中的每个函数都是“extern”,但是将它们标记为“extern”几乎没有任何好处,具体取决于编译器。大多数编译器可以自己解决这个问题。如您所见,这些函数实际上是在其他地方定义的。
在上面的例子中,main()只会打印一次hello world,但会继续输入bar_function()。另请注意, bar_function() 在此示例中不会返回(因为它只是一个简单的示例)。想象一下当信号被服务时 stop_now 被修改(因此,易失性),如果这看起来不够实用。
外部对于诸如信号处理程序、您不想放入标头或结构中的互斥锁等非常有用。大多数编译器都会进行优化以确保它们不会为外部对象保留任何内存,因为它们知道它们'将把它保留在定义对象的模块中。然而,同样,在对公共函数进行原型设计时,使用现代编译器来指定它没有什么意义。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)