含义
- 声明(Declaration)*:告诉编译器变量或者函数的信息,例如变量的类型(type)、命名(name)
- 定义(Definition)*: 为变量或者函数分配存储空间
变量(Variable)
对于局部变量(定义在函数或者代码块中的),声明和定义可以认为是等同的,因为声明变量的同时会为变量分配存储单元,即便在严格意义上认为局部变量的声明和定义是不同的,但是两个过程是不可拆分的,即无法只声明一个局部变量。对于全局变量(定义在函数外)来说,声明和定义是要做区别的,诸如int i
, static int i
这样的代码,变量的声明和定义是在一起的,即执行完代码之后,变量已经有了对应的存储单元。但是如果加上 extern 修饰符extern int i
,此时就仅仅是对变量的声明了,这个过程是不分配存储空间的, extern 会告诉编译器我的定义在其它的地方,你先使用我这个声明,等到编译时再链接到我的定义。
函数(functions)
int a(int i);
上面的只是声明(declare)了一个函数a,该声明描述了函数a的返回值类型(return type),函数命名(name),参数(parameters)的个数以及类型。当我们声明完变量a之后,编译器已经知道了函数a信息,但是并没有为函数分配空间,当我们为函数加上函数体(body)之后,函数才真正的被定义(define),如下,此时函数才有了对应的存储单元,执行该函数会返回1.1
2
3int a(int i) {
return 1;
}
在程序中,对同一个函数,可以有多次的声明(没有函数体),但只能有一次的定义(带函数体部分)。需要注意的一点是函数声明默认的存储类(storage class)是 extern 的,但函数的定义并不是。