全局变量用常量初始化----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++可以编译通过我就不知道了。
本文来自博客园,作者:高性能golang,转载请注明原文链接:https://www.cnblogs.com/zhangchaoyang/articles/1853816.html