1. #define
#define是预处理指令,在编译预处理时进行简单的替换
#define不作正确性检查,只有在编译时才会发现可能的错误并报错
#define更详细的介绍 快点我呀
#define INT int
#define TRUE 1
#define ADD (a,b) ((a)+(b));
#define LOOP for (int i=0; i<10; i++)
2. typedef
在C/C++语言中,typedef常用来定义一个标识符及关键字的别名(在自己的作用域内给一个已经存在的类型一个别名)
typedef是语言编译过程的一部分,但它并不实际分配内存空间
typedef可以增强程序的可读性,以及标识符的灵活性。常用于简化复杂类型,变量类型意义化等。
typedef double MyDouble; //给double取别名为MyDouble(变量类型意义化)
typedef NSTimeInterval MyTimeInterval; //给NSTimeInterval取别名为MyTimeInterval
typedef char * MyString; //给char *取别名为MyString
typedef struct Person
{
char *name
}MyPerson; //给Person结构体取别名为MyPerson。使用:MyPerson p = {"jack"};
typedef enum Man
{
man,
woman
} MyMan; //给Man枚举取别名为MyMan。使用: MyMan man = man;
typedef void(^MyBlock) (int a,int b); //给block取别名MyBlock
typedef int(*MyFunction) (int a,int b); //给指向函数的指针取别名MyFunction
3. typedef与#define的区别
-
执行时间不同
typedef在编译阶段有效。typedef有类型检查的功能。
#define则是宏定义,发生在预处理阶段。在编译预处理时进行简单的替换,不进行任何检查。
-
功能不同
typedef是类型替换,语句的一种,结尾必须有;
#define是文本替换,属于预编译指令,本身不参与编译,除非希望替换的文本中有;否则不用加。
例如:
若使用typedef char * MyString;则 MyString s1,s2 等价于 char *s1; char *s2
若使用 #define MyString char * 则 MyString s1,s2 等价于 char *s1,s2 即 char *s1; char s2
再次说明了typedef是类型替换,直接参与编译,而define只是简单的文本替换。
-
作用域不同
typedef若写在方法/函数中,则其作用域只在此方法/函数中有效。
#define若写在方法/函数中,则其作用域从写的地方开始有效,直至使用#undef(不写此指令则后面一直有效)。