微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

extern 关键字对 C 函数的影响

如何解决extern 关键字对 C 函数的影响

我们有两个文件,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”,但是将它们标记为这样几乎没有好处,具体取决于编译器。大多数编译器可以自己解决这个问题。如您所见,这些函数实际上是在其他地方定义的。

在上面的例子中,main() 只会打印一次 hello world,但会继续输入 bar_function()。另请注意, bar_function() 在此示例中不会返回(因为它只是一个简单的示例)。想象一下 stop_Now 在服务信号时被修改(因此,不稳定),如果这看起来不够实用的话。

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

希望有帮助:)

解决方法

在 C 语言中,我没有注意到extern函数声明之前使用的关键字的任何影响。起初,我认为extern int f();在单个文件中定义时会
强制 您在文件范围之外实现它。但是我发现两者:

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

extern int f() {return 0;}

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

extern 在函数定义之前 使用有什么影响吗?或者它只是一个可选关键字,对函数没有副作用。

在后一种情况下,我不明白为什么标准设计者选择在语法中添加多余的关键字。

编辑: 澄清一下,我知道 in variables 的用法extern,但我只是询问externin functions

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。