举个例子:
A)int i;
B)extern int i; (关于 extern,后面解释)
哪个是定义?哪个是声明?或者都是定义或者都是声明?我所教过的学生几乎没有一
什么是定义:所谓的定义就是(编译器)创建一个对象,为这个对象分配一块内存并给它
取上一个名字,这个名字就是我们经常所说的变量名或对象名 。但注意,这个名字一旦和
这块内存匹配起来(可以想象是这个名字嫁给了这块空间,没有要彩礼啊 。^_^),它们就同
生共死,终生不离不弃 。并且这块内存的位置也不能被改变 。一个变量或对象在一定的区
域内(比如函数内,全局等)只能被定义一次,如果定义多次,编译器会提示你重复定义
同一个变量或对象 。
什么是声明:有两重含义,如下:
第一重含义:告诉编译器,这个名字已经匹配到一块内存上了(伊人已嫁,吾将何去何
从?何以解忧,唯有稀粥),下面的代码用到变量或对象是在别的地方定义的 。声明可以出
现多次 。
第二重含义:告诉编译器,我这个名字我先预定了,别的地方再也不能用它来作为变量
名或对象名 。比如你在图书馆自习室的某个座位上放了一本书,表明这个座位已经有人预
订,别人再也不允许使用这个座位 。其实这个时候你本人并没有坐在这个座位上 。这种声
明最典型的例子就是函数参数的声明,例如:
void fun(int i, char c);
好,这样一解释,我们可以很清楚的判断:A)是定义; B)是声明 。
那他们的区别也很清晰了 。记住,定义声明最重要的区别:定义创建了对象并为这个
对象分配了内存,声明没有分配内存(一个抱伊人,一个喝稀粥 。^_^) 。
声明(declaration )指定了一个变量的标识符,用来描述变量的类型,是类型还是对象,或者函数等 。声明,用于编译器(compiler)识别变量名所引用的实体 。以下这些就是声明:
【c语言函数全局声明定义】extern int bar;
extern int g(int, int);
double f(int, double); // 对于函数声明,extern关键字是可以省略的 。
class foo; // 类的声明,前面是不能加class的 。
定义是对声明的实现或者实例化 。连接器(linker)需要它(定义)来引用内存实体 。与上面的声明相应的定义如下:
int bar;
int g(int lhs, int rhs) {return lhs*rhs;}
double f(int i, double d) {return i+d;}
class foo {};// foo 这里已经拥有自己的内存了,对照上面两个函数,你就应该明白{}的用处了吧?
无论如何,定义 操作是只能做一次的 。如果你忘了定义一些你已经声明过的变量,或者在某些地方被引用到的变量,那么,连接器linker是不知道这些引用该连接到那块内存上的 。然后就会报missing symbols 这样的错误 。如果你定义变量超过一次,连接器是不知道把引用和哪块内存连接,然后就会报 duplicated symbols这样的错误了 。以上的symbols其实就是指定义后的变量名,也就是其标识的内存块 。
总结:
如果只是为了给编译器提供引用标识,让编译器能够知道有这个引用,能用这个引用来引用某个实体(但没有为实体分配具体内存块的过程)是为声明 。如果该操作能够为引用指定一块特定的内存,使得该引用能够在link阶段唯一正确地对应一块内存,这样的操作是为定义 。
声明是为了让编译器正确处理对声明变量和函数的引用 。定义是一个给变量分配内存的过程,或者是说明一个函数具体干什么用 。可以加小编的群466572167,交流学习
推荐阅读
- 黑顺片是附子吗
- ps字体怎么变成斜体,PS该怎么样让字体倾斜
- cdr要怎么样才可以导出成jpg格式
- prey植物园救人,重生细胞植物园怎么进
- excel怎么画图,Excel应该怎么才可以画图
- 壁挂炉调到60度烧到40就停了,壁挂炉烧到60℃房子为啥不热
- cad字体大小要怎样更改,怎么改变cad图里字体的大小和粗细
- ps文字怎么修改,PS该怎么样打圈内环形文字
- 矿泉水不烧开可以喝吗,矿泉水只加热不烧开可以