c - 为什么全局变量默认有外部链接?
问题描述
int x; // global x, 0 initialized.
extern int y; // its storage duration, scope and linkage is equivalent to above.
int z = 5;
int main(){ return 0;}
根据https://stackoverflow.com/a/28610934/2402272,规则说:
在任何块之外声明的变量的默认存储持续时间、范围和链接,在最外层,具有静态存储持续时间、文件范围和外部链接。
x
不能在另一个源文件中定义,因为它没有标记为extern
,这样做是未定义的行为:
如何使用 extern 在源文件之间共享变量?
z
也不能在另一个源文件中定义,因为我们会multiple definition
在链接时出错。
因此,外部链接既不x
也z
无用。为什么他们默认是外部的呢?
解决方案
确实,x
并且z
不能在另一个源文件中定义,因为它们已经定义了。然而,它们可以在另一个文件中声明,以便可以使用它们。
如果您在另一个源文件中有以下内容:
extern int x;
extern int z;
然后,您将能够在该源文件中同时使用x
和使用。z
此外,如果您的代码自行编译成可执行文件,则链接阶段将失败,因为y
已声明但未定义。
推荐阅读
- javascript - 自从我更改了项目标签后,我的搜索功能已停止运行。
- square - 检索与付款相关的客户
- postgis - PostGIS:在涉及 MultiPolygon 的查询中识别匹配的多边形
- java - 不能从另一个线程调用 constraintLayout.remove();
- angularjs - 过滤具有不同值的单选按钮(AngularJS)?
- php - 如何在每次 php 调用后强制运行 php 扩展而不显式编写代码?
- python - 从 nodejs 访问 opencv 的 Python 脚本。
- excel - 在 Excel 中为图表选择数据时跳过行的语法是什么?
- python - 无法解析剩余部分:'{{ list[loop.index0] }}'
- python - 如何在没有 '[ ]' 和 ' ' 的情况下将字符串转换为列表