Extern关键字对C函数的影响

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (10)

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

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

extern int f() {return 0;}

编译得很好,没有来自gcc的警告。

提问于
用户回答回答于

我们有两个文件,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_函数()。

外部处理程序对于信号处理程序、不想放入头或结构的互斥对象非常有用。大多数编译器将进行优化,以确保不为外部对象保留任何内存,因为他们知道将在定义对象的模块中保留内存。

用户回答回答于

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

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

扫码关注云+社区