typedef和#define的区别
首先来清楚二者的用法:
typedef (类型名称) (类型标识符);
表示为一个现有的数据类型定义一个新的别名。
例子:typedef int intname;
表示为int这个数据类型定义了一个intname的别名
而#define;
#define int intname
表示宏定义,在以后的程序中,会把int替换为intname;
区别:
1、可以用其他类型说明符对宏类型名进行扩展,但对typedef所定义的类型名却不能这么做
#define intname int
unsigned intname i=10;//正确,编译器会把intname替换成int,且可以对i进行扩展为无符号整数
typedef int intname;
unsigned intname i=10;//错误,用typedef定义的int不可扩展
2、typedef 为某一种类型引入新的名字 ,并不为变量分配内存空间
如#define PI 3.14 ——会开辟一片存储空间,存3.14
但typedef int intname;——并不会再另外开辟存储空间,只是取了一个别名而已
3、typedef在编译时处理,有类型检查;#define在预处理阶段进行简单的字符串替换,不进行任何检查
4、#define没有作用域限制,定义过的宏在之后的程序都可以调用;typedef有自己的作用域(在定义函数内)
5、在连续几个变量的声明中,用typedef定义的类型可以保证声明中所有的变量均为同一种类型,而用#define定义的类型则无法保证:
typedef char* CharName;
CharName ch1,ch2;//这样可以保证ch1和ch2都是指向字符变量的指针
static和extern区别
static
1、修饰局部变量–>提升局部变量的生存周期;
2、修饰全局变量–>作用域被限制了(限制在当前文件中使用);
3、修饰函数,–>作用域也被限制,只能在当前文件中使用
extern
1、extern置于变量或者函数前,作用域是整个工程,表示变量或者函数的定义在别的文件中,通过在变量前添加extern来访问这个全局变量,
2、extern修饰的变量没有真正的内存
static
定义一个内部变量或者声明一个内部变量
extern
定义一个外部变量或者声明一个外部变量
可以这样说:用static的语句中,全部的操作只能在内部进行,外部不可访问;而使用extern可以使用外部的函数或者变量,在整个程序前声明就可以