C-c语言多文件全局变量问题

发布于 2017-01-05 22:31:07 字数 208 浏览 1116 评论 3

两个文件
1.c
int a;
int main()
{...}
2.c
short a=10;

编译可通过,执行后a为10,
1.c中改为给a赋值后就变量重定义错误了
为什么原来没有重定义错误呢,自动extern了?
在两个文件中定义相同名字的变量后共同编译到底是怎么处理他们之间的逻辑关系的?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

晚风撩人 2017-08-23 09:40:35

int a ; //这叫声明式,告诉编译器某个东西的名称和类型,但略去细节,事实上应该为extern int a ;
short a = 10 ; //这叫定义式,定义式任务是提供编译器一些声明式所遗漏的细节,为此对象拨发内存的地点。两个文件只出现一个定义式,所以不会出现重定义错误。

清晨说ぺ晚安 2017-07-24 20:40:08

这得看具体的系统,一般,一个外部变量只能定义一次,最好定义一次。

情况一:
文件1中定义:int a = 10;
文件2中定义:int a = 10;
大多数系统拒绝情况一。

情况二
文件1中声明:int a;
文件2中定义:int a = 10;
某些系统会接受情况二。

情况三
文件1中声明:int a;
文件2中声明:int a;
某些系统会接受情况三。

楼主的情况
文件1:int a;
文件2:short a = 10;
如果系统接受此种情况,那么可能原因是:
a的两个实例虽然要求的存储空间的大小不同,但是共享存储空间,给其中一个赋值,对另一个也是有效的。

在《c陷阱与缺陷》这本书中,作者说是否接受多次定义要看具体的系统,且有一节给的例子是:
文件1:extern int n;
文件2:long n;
比较符合楼主给出的情况。

如果想限制全局变量只能在一个源文件中使用,其他源文件中不可使用,可加static修饰符。
如:
文件1中定义:static int a = 10;
文件2中定义:int a = 10;
这种情况所有系统都会接受,因为文件1中的变量a加了static后只能在文件1中使用,和文件2中的a不会冲突。

甜柠檬 2017-01-10 19:11:38

用static 限制变量在本文件使用

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文