gpt4 book ai didi

c - extern 关键字对 C 函数的影响

转载 作者:太空狗 更新时间:2023-10-29 16:14:13 26 4
gpt4 key购买 nike

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

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

extern int f() {return 0;}

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

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

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

编辑: 澄清一下,我知道变量中有 extern 的用法,但我只是询问 中的 extern功能

最佳答案

我们有两个文件,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 之间没有共享 header ,但是 bar.c 在链接时需要在 foo.c 中声明的内容,而 foo.c 在链接时需要来自 bar.c 的函数链接。

通过使用“extern”,您告诉编译器它后面的任何内容都将在链接时找到(非静态);不要在当前pass中为它保留任何东西,因为稍后会遇到它。函数和变量在这方面被同等对待。

如果您需要在模块之间共享一些全局变量并且不想在 header 中放置/初始化它,这将非常有用。

从技术上讲,库公共(public) header 中的每个函数都是“外部”的,但是根据编译器的不同,将它们标记为“外部”几乎没有任何好处。大多数编译器可以自己解决这个问题。如您所见,这些函数实际上是在其他地方定义的。

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

Externs 对于信号处理程序、不想放在头文件或结构中的互斥量等非常有用。大多数编译器会进行优化以确保它们不会为外部对象保留任何内存,因为他们知道他们将在定义对象的模块中保留它。然而,再次声明,在对公共(public)函数进行原型(prototype)设计时,使用现代编译器指定它毫无意义。

关于c - extern 关键字对 C 函数的影响,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/856636/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com