我在C语言中了解到,变量定义和声明的处理方式类似,除非我们使用关键字extern,例如在以下代码中:
extern int i;
int main () {
..
int i = 1;
..
}
我知道'i'是在'main'外部声明的,但是它的内存是在'main'内部分配的。我有两个问题:(i)我是堆栈变量还是数据段上的变量(全局变量)?(ii)我的范围是多少?如果两个文件的可执行文件在运行时链接在一起,是否可以在上述.c文件外部看到?还是我们需要extern int i?每个文件中的声明?
请帮助?我不熟悉C / C ++以外的语言;因此,我很难理解变量定义和变量声明之间的区别。
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
引用的任何对象没有关系。