1、先说“声明”和“定义”的区别:(这里的对象泛指函数、变量等)
“声明”只是简单地告诉编译器在其他地方创建的对象的名字,允许你使用这个名字,并不分配内存空间,以extern关键字标识。
“定义”是一种特殊的声明,它在声明的同时告诉编译器为对象分配内存空间。C语言的对象必须有且只有一个定义,但可以有多个extern声明。
定义 | 只能出现在一个地方 | 确定对象的类型并分配内存,创建新的对象,如int a[10]; |
声明 | 可以多次出现 | 描述对象的类型,用于指代其他地方定义的对象,如extern int a[];这里由于不分配内存,所以不需要指定数组长度。 |
2、再说typedef和#define的区别:
typedef:为数据类型创建别名,如: typedefint MyInt;
#define: 宏定义,宏文本替换,如: define N100
二者之间的关键区别在于编译器把typedef定义的类型视为一种彻底的类型封装,声明之后不允许往里面增加别的东西。从下面两个例子可以看出二者的不同:
(1) #define MyInt int
unsigned MyInt i;//OK,no problem
typedef int MyInt;
unsigned MyInt i;//Error,illegal
(2) #define int_ptr int*
int_ptr a,b;//扩展以后:int* a,b;(a,b为不同的类型)
typedef int_ptr int*;
int_ptr a,b;//a,b类型一致,都为int*