我的问题是什么时候一个函数应该引用extern关键字在C。

我看不出什么时候应该在实践中使用这种方法。当我在编写程序时,我使用的所有函数都可以通过我包含的头文件获得。那么,extern访问头文件中没有公开的内容为什么有用呢?

我可能在想extern如何不正确地工作,如果是这样,请纠正我。

也. .当它是头文件中没有关键字的默认声明时,您是否应该扩展某些内容?


当前回答

当你在不同的dll或lib上定义该函数时,编译器会根据链接器来查找它。典型的情况是当你从OS API调用函数时。

其他回答

Extern更改链接。使用关键字,函数/变量被假定在其他地方可用,解析被推迟到链接器。

函数上的extern和变量上的extern是不同的。

对于变量,它不实例化变量本身,即不分配任何内存。这得在别的地方做。因此,如果您想从其他地方导入变量,这是很重要的。

对于函数,这只告诉编译器链接是extern。因为这是默认值(使用关键字static表示函数没有使用extern链接绑定),所以不需要显式地使用它。

当你在不同的dll或lib上定义该函数时,编译器会根据链接器来查找它。典型的情况是当你从OS API调用函数时。

头文件中所有函数和变量的声明都应该是extern。

该规则的例外是头文件中定义的内联函数和变量,尽管在头文件中定义,但它们必须是翻译单元的本地变量(头文件包含的源文件):这些应该是静态的。

在源文件中,extern不应该用于文件中定义的函数和变量。只需要为本地定义加上静态前缀,而不需要为共享定义做任何事情——默认情况下,它们将是外部符号。

在源文件中使用extern的唯一原因是声明在其他源文件中定义且没有提供头文件的函数和变量。


声明函数原型extern实际上是不必要的。有些人不喜欢它,因为它只会浪费空间,而且函数声明已经有溢出行限制的倾向。其他人喜欢它,因为这样,函数和变量可以以相同的方式处理。

前面已经说过,extern关键字对于函数来说是多余的。

对于跨编译单元共享的变量,应该在头文件中使用extern关键字声明它们,然后在单个源文件中定义它们,不使用extern关键字。为了最佳实践,单个源文件应该是共享头文件名称的文件。

Extern告诉编译器这个数据是在某个地方定义的,并且将与链接器连接。

在这里的回答和与一些朋友的交谈的帮助下,这里有一个使用extern的实际示例。

例1 -显示一个陷阱:

stdio . h:

int errno;

myCFile1.c:

#include <stdio.h>

// Code using errno...

myCFile2.c:

#include <stdio.h>

// Code using errno...

如果myCFile1。o和myCFile2。O是链接的,每个c文件都有单独的errno副本。这是一个问题,因为相同的errno应该在所有链接的文件中可用。

例2 -修复。

stdio . h:

extern int errno;

stdio.c:

int errno;

myCFile1.c:

#include <stdio.h>

// Code using errno...

myCFile2.c:

#include <stdio.h>

// Code using errno...

如果两者都是myCFile1。o和MyCFile2。O由链接器链接,它们都指向相同的errno。因此,用extern解决实现问题。