c - 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++ 以外的语言;因此我很难理解变量定义和变量声明之间的区别。
解决方案
extern int i;
声明,但不定义i
. 如果i
使用它并且在某处没有定义它,则链接通常会失败。如果它没有extern
,那么它只是说int i;
或int i = 0;
,它会定义i
。(前者是一个暂定定义,如果没有非暂定定义,则作为默认值。)
由于位于块内(由andint i;
包围的语句序列,在本例中是定义 的块),因此它定义了一个新对象。该名称指的是该块外部和内部的不同事物(但在定义之后)。{
}
main
i
main
int i;
i
声明者的范围extern int i;
是从其声明到结束的整个文件。(该范围包括 中的块main
,但这i
被块内部隐藏int i;
。从技术上讲,第一个的范围i
包括该区域 - 它存在但隐藏且不可访问。)声明名称extern
不会将其范围扩展到当前文件之外. 相反,它为它们提供了links,这意味着它们可以引用在另一个文件中以相同名称声明的相同对象。
i
声明者的范围int i;
是从其声明到声明它的块的末尾。
如果实际需要,内部定义的通常由普通编译器分配在堆栈上i
。main
(如果程序实际上并没有使用它,或者编译器可以通过优化消除对它的使用或将它们折叠到其他表达式中,它可能不需要实际为其分配任何堆栈空间。) this 引用的对象i
没有关系到i
块外部引用的任何对象。
推荐阅读
- html - Angular innerHTML 内容混乱。只有最后一个 innerHTML 正确显示
- javascript - 使用 jQuery 触发提交按钮
- azure-devops - 从 Azure DevOps 站点摘要部分中的标记获取数据以在 Power BI 中使用
- c# - 向 DataGridView 添加行时出现 NullReferenceException
- javascript - 澄清 setTimeout 和 forloop 交互的工作原理
- python - pandas 中 csv 文件的错误数据类型检测
- excel - 循环遍历多个工作簿不起作用
- php - 如何正确地将派生类的方法设置为父类的可调用方法?
- c# - OpenIddict:如何在资源服务器中注册签名密钥以验证令牌?
- c# - 如何调用随机类方法/函数?