为了账号安全,请及时绑定邮箱和手机立即绑定

Extern关键字对C函数的影响

Extern关键字对C函数的影响

C
临摹微笑 2019-07-16 16:43:33
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在……里面功能.
查看完整描述

3 回答

?
Cats萌萌

TA贡献1805条经验 获得超9个赞

我们有两个文件,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){
   while (! 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被修改,如果这看起来不够实用的话。

Externs对于诸如信号处理程序、不想放入头或结构等的互斥对象非常有用。大多数编译器将进行优化,以确保它们不为外部对象保留任何内存,因为它们知道它们将在定义对象的模块中保留它。然而,在构建公共函数的原型时,用现代编译器来指定它也没有什么意义。

希望有帮助:)


查看完整回答
反对 回复 2019-07-16
?
杨魅力

TA贡献1811条经验 获得超5个赞

就我记忆中的标准而言,默认情况下所有函数声明都被视为“extern”,因此不需要显式地指定它。

这并不使这个关键字无用,因为它也可以与变量一起使用(在这种情况下-它是解决链接问题的唯一解决方案)。但是功能-是的,这是可选的。


查看完整回答
反对 回复 2019-07-16
  • 3 回答
  • 0 关注
  • 310 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信