C中'extern'关键字的混淆

问题描述 投票:0回答:1

我在C语言中了解到,变量定义和声明的处理方式类似,除非我们使用关键字extern,例如在以下代码中:

extern int i;

int main () {

..

int i = 1;

..

}

我知道'i'是在'main'外部声明的,但是它的内存是在'main'内部分配的。我有两个问题:(i)我是堆栈变量还是数据段上的变量(全局变量)?(ii)我的范围是多少?如果两个文件的可执行文件在运行时链接在一起,是否可以在上述.c文件外部看到?还是我们需要extern int i?每个文件中的声明?

请帮助?我不熟悉C / C ++以外的语言;因此,我很难理解变量定义和变量声明之间的区别。

c extern
1个回答
0
投票

extern int i;声明,但未定义i。如果使用此i,但在某处没有定义,则链接通常会失败。如果没有extern,则只说int i;int i = 0;,它将定义i。 (前者是一个暂定定义,如果没有非暂定定义,它将作为默认值。)

由于int i;在一个块内(由{}包围的语句序列,在这种情况下为定义main的块),因此它定义了一个新对象。名称i指代main之外和此块内部(但在int i;定义之后)的不同内容。

i声明的extern int i;的范围是从声明到末尾的整个文件。 (该范围包括main中的块,但此i被该块内部的int i;隐藏。从技术上讲,第一个i的范围包括该区域-该区域存在但隐藏且不可访问。)用extern声明名称不会将其范围扩展到当前文件之外。而是给它们linkage,这意味着它们可以引用另一个文件中以相同名称声明的同一对象。

i声明的int i;的范围是从其声明到声明它的块的末尾。

i内部定义的main通常由实际的编译器分配在堆栈上,如果实际需要的话。 (如果程序没有实际使用它,或者编译器可以通过优化消除它的使用或将它们折叠为其他表达式,则它可能实际上不需要为其分配任何堆栈空间。)i引用的对象与该块外部i引用的任何对象没有关系。

© www.soinside.com 2019 - 2024. All rights reserved.