理解 C

问题描述

这个语句 extern int x=4; 在 C 中是什么意思?是否类似于int x=4;

当我在块(函数)之外编译代码 extern int x=4; 时,编译器会发出警告,而不是错误。

警告:-

警告:'x' 已初始化并声明为 'extern' extern int x=3;

与此同时,当我在块(函数)内编译代码 extern int x=4; 时,编译器会引发错误。

错误:-

错误:'x' 有 'extern' 和初始值设定项 extern int x=3;

这是怎么回事,我没听明白。extern int x=4; 语句实际上是什么意思?请明确概念。

提前致谢...

解决方法

extern 的含义有点复杂,因为 C 是随着时间的推移由不同的人尝试不同的东西开发的,而不是从一开始就知道最终产品应该是什么而设计的。

块内的 extern int x=4; 是错误的原因是它违反了 C 2018 6.7.9 5 中的这条规则:

如果标识符的声明具有块作用域,并且标识符具有外部或内部链接,则声明不应有标识符的初始值设定项。

我不确定该规则的确切动机是什么。一个动机可能是,“编译器在这里忙于定义一个函数,同时定义另一个东西对编译器来说是出乎意料的、尴尬的或困难的。”我不确定它实际上是否难以实现,但对于某些编译器,尤其是早期的编译器来说,这可能是一个问题。

发出警告的一个原因是我们通常使用带有声明的 extern 来表示“我们声明此标识符只是为了告诉您在其他地方定义的对象。”这是一个常见的做法,而不是规则。1 但是初始化说“我们在这里定义一个对象。”所以这是一个对比,编译器会警告你。但是,这并不是实际的规则违规,因此编译器不会将其报告为错误。

脚注

1 有一些规则适合这种做法。在文件范围内,int x; 是一个暂定定义,而 extern int x; 是一个不是定义的声明。这样才符合惯例; extern int x; 表示我们只是在声明 x,而 int x; 表示我们可能正在定义它。但是,int x = 4;extern int x = 4; 都是定义,不违反任何规则。

,

直觉上,我喜欢将 extern 视为“在另一个文件中引用(全局)对象”。不能在函数内部定义全局对象,所以这个概念没有意义。

可以初始化 extern 变量,但不推荐。如果实例化未初始化,并且您有条件地添加一组初始化变量的文件中的一个,以及多个使用它的文件。这可能是一个坏主意,但如果您在声明中屏蔽了内存的特殊部分,我可以看到它的用例。另一个用例是如果它可以是另一个文件中的全局变量,但您可能会或可能不会包括该文件。在没有外部声明的情况下,编译器会为你分配内存,并把它当作一个普通的全局变量。

如果在多个文件中初始化多个值,几乎肯定会出现链接器错误。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...