变量的声明与定义
来源:互联网 发布:c 编程无线电 编辑:程序博客网 时间:2024/04/29 19:46
1、为什么要区分变量的声明与定义?主要是为了让多个文件可以访问同一个变量。
2、一个变量的定义会为变量分配存储空间,也有可能同时为其提供初始值;
3、声明则仅给出变量的数据类型和变量名称;
4、变量的定义肯定也是变量的声明,反之则未必;
5、在作用域内,变量的定义有且仅有一个,声明则可以有多个
6、有extern的时候,两者的情况区分:
extern int i; 声明而不是定义,因为不分配存储空间
extern int i = 1; 定义,因为分配了存储空间;
最后一句,是有问题的,C/C++规则,一个全局变量,不是static,register就是extern,(不要和我说auto这个类型,在TC时代就是空壳类型了,它会成为extern),register也不是所有的编译器支持,没有必要写extern,在VC6中
extern int i; // 声明而不是定义,因为不分配存储空间。
extern int i = 1; //定义,因为分配了存储空间
这样写就是错的,因为编译器无法区分那里是定义,那里是声明,因为全局变量是可以没有初值的.
其实"变量的声明和定义"是指全局变量的声明和定义,因为局部变量没有声明的意义.
之所以要声明主要的原因是一个编译问题,当你在一个A.CPP文件(或者A.C)中定义一个全局变量global,.当A.CPP变成A.OBJ的时候这个global的相关信息就会保存在A.OBJ里面.而一个软件工程不可能只有一个A.CPP,还会有B.CPP,那么B中的程序也需要使用这个global,B.CPP就需要一种办法知道这个符号global是什么类型,于是你需要声明在工程里的另一个文件里有这个符号global,这个时候用到了关键字extern.当B.CPP变成B.OBJ的时候global只会在B.OBJ保存一个引用副本信息.
当A.OBJ和B.OBJ一起被连接成为一个.EXE(或者其他最终文件)的时候,连接器会根据B.OBJ中引用副本信息在A.OBJ中找到global的具体信息以及虚地址信息.
你可以做一个简单的实验,在B.CPP里面写一个global但不是声明而是一个定义,不加extern.这时候你的编译没有问题,但A.OBJ和B.OBJ一起被连接时就会报错,重定义,这时候你可以把其中一个global的定义前加static,这时候static的global会被连接器做特殊处理,只有定义这个global的.OBJ才可以引用它,其他OBJ根本看不到他.
LZ如果接触很多大规模工程(20个以上.CPP.C.CXX.RC之类的文件.H文件不算)就不会对这个问题感到陌生了,希望对你有用!
有用就给分哦~~~~
- 变量的定义与声明
- 变量的定义与声明
- 变量的声明与定义
- 变量的声明与定义
- 变量的声明与定义
- 变量的定义与声明
- 变量的声明与定义
- 变量的定义与声明
- 变量的声明与定义
- 变量的声明与定义
- 定义变量 与 声明变量 的区别
- 变量与函数的声明与定义
- 变量 声明与定义
- 变量定义与声明
- 变量声明与定义
- 变量声明与定义
- 变量的定义与声明的区别
- 变量的定义与声明的区别
- WebHarvest 抓取 火影忍者 漫画
- .net 火车头 ------表单(form)的自动填写和提交
- TWI读写ZLG7290
- 使用SDP建立SQL与DB2交互
- aspx中相似的控件
- 变量的声明与定义
- Google Android源代码结构
- 三、CentOS下安装nginx、php和mysql
- AsyncTask 学习翻译并总结
- 数据结构的应用——使用栈实现十进制到其他(2、8、16)进制的转换
- 播放器属性注释
- win7版本解释
- SilverLight 与 ASP.NET页面交互
- 继承JsonConverter实现json.net支持dataset与datatable序列化