全局变量用常量初始化----C和C++的不同
来源:互联网 发布:python 聚合搜索 编辑:程序博客网 时间:2024/05/17 01:42
有两个程序:
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++可以编译通过我就不知道了。
- 全局变量用常量初始化----C和C++的不同
- C语言全局变量的初始化和字符串常量
- 实例说明C语言中初始化和未初始化的全局变量所在不同的段
- C语言全局变量的初始化
- C中全局变量和局部变量的初始化问题
- C语言中全局变量初始化的重要性!!!
- c/c++的全局变量初始化顺序
- c语言中全局变量的初始化
- C/C++关于全局变量和局部变量初始化与不初始化的区别
- C/C++关于全局变量和局部变量初始化与不初始化的区别
- C/C++ 的全局变量初始化与不初始化的区别
- C/C++ 的全局变量初始化与不初始化的区别
- C/C++的全局变量初始化与不初始化的区别
- C/C++的全局变量初始化与不初始化的区别
- C/C++的全局变量初始化与不初始化的区别
- 为什么初始化的全局变量和未初始化的全局变量要保存在不同的段??
- 【C学习笔记】【疑问】关于const常量的实现机制在C和C++中的不同
- C/C++ --- 全局变量初始化总结
- Linux内存管理
- 从文件中查找单词
- Arithmetic Encoding(压缩算法)
- 拓扑排序
- Linux常用命令
- 全局变量用常量初始化----C和C++的不同
- 动态创建和释放二维数组
- Oracle 10g 物理Dataguard日常操作维护(二)
- Linux下利用多线程实现矩阵相乘的并行计算
- 动态规划--买书怎么组合花钱最少
- 调用Google API做自己的翻译工具
- 最大流
- 最短路径
- 并行计算圆周率