第二段生命  • • •  VIM Configuration for C       all posts in Archive

C语言学习:#define 与 typedef

C语言里,#definetypedef 看起来是挺接近的东西。我们可以让他们达到相同的效果,比如:

#define MY_TYPE int
typedef int My_Type;

但本质来说,他们的区别可大了去了。

1. 编译时间不同
  • #define is a preprocessor token: the compiler itself will never see it.
  • typedef is a compiler token: the preprocessor does not care about it.

#define是在预编译阶段编译的,而typedef是在编译的时候才执行的。

2. #define只是简单的替换,而typedef是为一个原有的关键字起一个“别名”。

2.1 #define 经常被用来处理“魔数”问题,例如
#define PI 3.1415926;
2.1 typedef的主要用在给结构体起别名,例如:
typedef struct student
{
char name[16];
int age;
double score;
} Stu,*pStu;</p>

2.3 定义指针时的区别</h6>

typedef int* int_p1;
int_p1 a, b, c;  // a, b, and c are all int pointers.

#define int_p2 int*
int_p2 a, b, c;  // only the first is a pointer!
2.4 只能用 typedef 的时候
#define MY_TYPE void (*)(int)
typedef void (*fun_p)(int);

void fx_typ(fun_p fx); /* ok */
void fx_def(MY_TYPE fx); /* error */

typedef int arr[10];
arr a, b, c; // create three 10-int array
3.参数问题:#define是可以带参数的,例如:
#define XX(a,b) myfun(a,b);