首页 > 解决方案 > C中的'extern'关键字混淆

问题描述

我知道在 C 中,变量定义和声明的完成方式类似,除非我们使用关键字 extern,例如在以下代码中:

extern int i;

int main () {

..

int i = 1;

..

}

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

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

标签: cextern

解决方案


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

由于位于块内(由andint i;包围的语句序列,在本例中是定义 的块),因此它定义了一个新对象。该名称指的是该块外部和内部的不同事物(但在定义之后)。{}mainimainint i;

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

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

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


推荐阅读