不管是在C语言还是在C++中,typedef这个词都不少见,当然出现频率较高的还是在C代码中。typedef和#define有些相似,但更多的是不同,特别是在一些复杂的用法上,就完全不同了。
1.宏定义(#define)
宏定义又称为宏代换、宏替换,简称“宏”。
格式:#define 标识符 字符串
其中的标识符就是所谓的符号常量,也成为“宏名”。
预处理(预编译)工作也叫作宏展开:将宏名替换为字符串。掌握“宏”概念的关键是“换”,一切以换为前提。
2.自定义数据类型(typedef)
定义一种类型的别名,而不只是简单的宏替换。可以用typedef可以解决同时声明多个指针型变量的问题。
请看下面的例子:
#define INT1 int
typedef int INT2;
#define PINT int *
typedef int * SINT;
从形式上看它们相似,但在实际使用中却不相同。
下面分别用INT1,INT2,PINT,SINT定义变量就可以看出它们的区别:
INT1 a,b;
INT2 c,d;
PINT e,f;
SINT g,h;
在经过宏替换后变为:
int a,b;
INT2 c,d;
int * e,f;
SINT g,h;
在上面的变量中,变量a和b为整型变量,变量c和d也为整型变量;在这里我们看不出宏定义和数据类型定义的区别。而变量e为整型指针变量,变量f为整型变量;变量g和h则均为整型指针变量,因为SINT是一个类型说明符。由这个例子可见,宏定义虽然也可表示数据类型,但毕竟是作为字符替换。在使用时要分外小心,以避出错。