变量的声明与定义

来源:互联网 发布: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文件不算)就不会对这个问题感到陌生了,希望对你有用!
有用就给分哦~~~~

原创粉丝点击