一、简介
#define(宏定义)只是简单的字符串代换(原地替换),它本身并不在编译过程中进行,而是在这之前(预处理过程)就已经完成了。
typedef常用来定义一个标识符及关键字的别名,它是语言编译过程的一部分,但它并不实际分配内存空间。
例如使用typedef 定义size_t类型:
typedef int size_t;//类型是一个数据模板,变量是一个实在的数据。类型是不占内存的,而变量是占内存的。
C语言的2种类型:内建类型(ADT)与用户自定义类型(UDT)
内建类型是编译器定义的原生类型(基础数据类型,如int、double之类的);用户自定义类型不是语言自带的是程序员自己定义的(譬如数组类型、结构体类型、函数类型·····)。
二、示例代码
#define只是原地展开,这个实际使用过程中要特别注意,例如以下两个例子:
- 例(1)
#define dpChar char * //#define不是语句( 不以';'结尾)
typedef char * tpChar; // typedef是语句( 以';'结尾)
dpChar p1, p2; // 展开:char *p1, p2; 相当于char *p1, char p2;
tpChar p3, p4; // 等价于:char *p3, char *p4;
printf("sizeof(p1) = %d.\n", sizeof(p1)); // 4
printf("sizeof(p2) = %d.\n", sizeof(p2)); // 1
printf("sizeof(p3) = %d.\n", sizeof(p3)); // 4
printf("sizeof(p4) = %d.\n", sizeof(p4)); // 4
- 例(2)
#define Add(a,b) a+b;
一般的单独使用是没有问题的,但是如果遇到如:c * Add(a,b) * d的时候就会出现问题,代数式的本意是a+b然后和c,d相乘,但是因为使用了define(它只是一个简单的替换),所以式子实际上变成了c*a + b*d 。
#define经常还和条件编译搭配使用,如以下几个例子:
- 例(3)
#ifndef ABCD_H
#define ABCD_H
// ... some declaration codes
#endif // #ifndef ABCD_H
头文件经常这么写,目的是防止重复包含头文件的宏。
- 例(4)
#ifdef ABC
// ... codes while definded ABC
#elif (CODE_VERSION > 2)
// ... codes while CODE_VERSION > 2
#else
// ... remained cases
#endif // #ifdef ABC