全局变量用常量初始化----C和C++的不同

有两个程序:

int i=10;

int j=i+4;

main(){}

/***********************/

int i=10;

main()

{static int j=i;}

/************************/

如果把文件命名为.c,用gcc去编译会出现“initializer   element   is   not   constant ”错误。

如果把文件命名为.cc,用g++去编译正确通过!

 

我们知道静态变量(全局和局部的)、常量、全局变量存储在数据段(参见我的另一篇博客《Linux内存管理》),一个可执行文件(只是一个静态文件,还没有运行)有代码段、数据段和示未初始化数据段。

计算机只会“取 i 的地址,把3 放到 i 的地址中,取 i 的地址,读取这个地址中的内容,取 j 的地址,把这个内容 写入j 的地址。” 它不会思考,不懂因果,只是机械地执行指令。编译器无法在编译时求得一个非常量的值,它只能在运行时通过读取变量地址来间接得到变量的值,而全局变量在编译时就必须确定其值,故C存储在数据段的数据必须用常量初始化

在编译时只能用常量去初始化一个静态存储区的数据,而不能用“读取某个变量的内容”来初始化,所以编译器会将j 放入 .bss段,默认值为0 ,然后添加一条语句在运行时读取i 的值,再赋给j。这条语句在调用main()之前完成。

 

至于说为什么g++可以编译通过我就不知道了。

posted @ 2010-10-17 21:16  高性能golang  阅读(2181)  评论(0编辑  收藏  举报