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

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

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

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


当前回答

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

其他回答

在C语言中,函数原型隐含了extern,因为原型声明了在其他地方定义的函数。换句话说,函数原型默认具有外部链接;使用extern很好,但这是多余的。

(如果需要静态链接,函数必须在它的原型和函数头中都声明为静态的,并且它们通常都应该在同一个.c文件中)。

在其他源文件中实际定义的函数应该只在头文件中声明。在这种情况下,在头文件中声明原型时应该使用extern。

大多数情况下,你的函数会是以下其中之一(更像是最佳实践):

静态(不是静态的普通函数 可见的外部。c文件) 静态内联(内联来自。c或。h 文件) 的头中的声明 下一类(见下文)) [no关键字whatever](正常 用于访问的函数 外面的声明)

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

如果程序中的每个文件首先被编译为一个目标文件,然后目标文件被链接在一起,则需要extern。它告诉编译器“这个函数存在,但是它的代码在其他地方。不要惊慌。”

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

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

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

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


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