Extern关键字对C函数的影响

Extern关键字对C函数的影响

在C中,我没有注意到extern函数声明之前使用的关键字。起初,我认为当定义extern int f();在一个文件中在文件的作用域之外实现它。但是我发现两者都是:

extern int f();int f() {return 0;}

extern int f() {return 0;}

编译得很好,没有GCC的警告。我用gcc -Wall -ansi它甚至不会接受//评论。

是否有使用的效果?extern 函数定义之前?或者它只是一个可选的关键字,对函数没有副作用。

在后一种情况下,我不明白为什么标准设计人员选择用多余的关键字乱扔语法。

编辑:为了澄清,我知道extern在变量中,但我只是问extern在……里面功能.


慕妹3242003
浏览 655回答 3
3回答

摇曳的蔷薇

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

慕少森

就我记忆中的标准而言,默认情况下所有函数声明都被视为“extern”,因此不需要显式地指定它。这并不使这个关键字无用,因为它也可以与变量一起使用(在这种情况下-它是解决链接问题的唯一解决方案)。但是功能-是的,这是可选的。
打开App,查看更多内容
随时随地看视频慕课网APP