【发布时间】:2021-02-23 03:44:23
【问题描述】:
我读到 extern 关键字隐含在函数的上下文中,所以除非您另外指定使用 static 关键字(如果我没记错的话,它基本上是一个与 @ 完全不同的概念987654328@ 变量使用——它们只是共享一个关键字),它们对所有目标文件都是可见的。这是有道理的;将声明隐含在外部,虽然在声明与定义位于同一文件中时技术上没有必要,但它很有用,因为程序员不必在每次想要使用其定义文件中的函数时都键入 extern,情况往往如此。对我来说奇怪的是它是隐含的声明和定义。
对于变量,我不需要在定义中包含extern,事实上,虽然我可以做到这一点而不会出错,但我的编译器会为此发出警告。
例如,我可以有mylib.h:
int var = 5;
//it isn't necessary to write this as
//extern int var = 5;
//my compiler even warns against it
和test.c
#include "mylib.h"
extern int var;
我通常会假设函数的隐式extern 是相同的,也就是说,如果我在mylib.h 中定义了int func(int par),则在它之前不会有隐式extern,但会有一个隐含的extern 用于任何声明(例如,如果我声明它用于test.c)。
从 extern 关键字的角度来看,它也没有多大意义,它被用作告诉编译器在其他地方寻找定义的一种方式,而定义永远不会在它所在的文件之外。
我觉得我在这里遗漏了一些东西。
【问题讨论】:
-
也许我误解了你的问题,但在我看来你这样做是错误的。将
int var放入h 文件并将extern int var放入c 文件不是通常的方法。不确定这些 Q 是否是骗子,但我认为您可以通过阅读找到所需的信息:stackoverflow.com/q/1433204/4386427 和 stackoverflow.com/q/1410563/4386427 -
如果您在
mylib.h中写入int var = 5;,那么它定义了变量。在任何给定的程序中,只有一个文件可以包含mylib.h— 如果多个文件包含标题,则会出现多重定义错误。默认情况下,使用 GCC 10.x,即使您在标头中写入int var;(而不是extern int var;),最终也会出现多个定义错误——尽管旧版本的 GCC 默认情况下不会这样做。跨度> -
变量和函数的
static关键字限制了命名对象的可见性。有一些区别——例如,你可以在函数中使用静态变量。但是这些概念非常相似,以至于说 "[static应用于函数] 基本上是一个与变量使用的static完全不同的概念 至少是夸大了。 -
@thepufferfish 从您链接的图片中,很明显这本书正在讨论两个不同的源文件(又名 c 文件)。它不是在谈论一个 h 文件和一个 c 文件。
标签: c function extern function-definition