C++中的typedef和define的区别
我们来看看typede和define的区别
define是C++中用来定义宏的,也就是宏定义用的,宏在代码中就是纯粹进行简单的替换,这个替换过程不是在C++的编译过程中进行的,而是在这之前的预处理过程中就已经完成了. 因为它不是在编译过程中进行,所以如果有潜在的错误,很难发现.
typedef 说白了,就是起别名,是为了增加可读性而为标识符另起的新名称(仅仅只是个别名),它是C++语言编译过程的一部分,也就是说在编译过程中进行,但它并不实际分配内存空间。 它和宏定义不一样,并不只是简单的进行替换
我们来看一个例子,来证明typedef不是简单的进行宏替换:
typedef char* p
int myFunc(const p,const p); => 如果它和宏一样,只是简单的替换,那么这里就会变成 int myFunc(const char*,const char*);
但实际上并不是这样的,typedef char* p => p是一个char类型的指针的别名,const 修饰这个指针,就给予了整个指针本身以常量属性,所以就形成了常量指针 char* const => 所以它实际是 int myFunc(char* const,char* const);
牢记: 当const和typedef一起出现时,typedef不是简单的字符串替换就行
另外,两者还有以下一些不同
1. 当用宏来定义一个类型别名时,定义完后还可以用其他类型说明符来对宏类型名进行扩展. 但用typedef所定义的类型名却不可以这样做
eg:
#define p int unsigned p i; //这个i 用宏p修饰时,代表是个整形变量, 我们又在这之前加上unsigned,表示是个无符号整形变量
//但是typedef 我们就不能这么干,比如以下做法会报错
typedef int bTest;
unsigned bTest i; // 报错 error illegal
2. 在连续几个变量的声明中,用typedef定义的类型可以保证声明中所有的变量为同一个类型,但是用#define定义的类型是无法保证的,它只能保证第一个变量是宏别名定义的类型
eg:
#define intPtr int* intPtr peach, cheese //这里,宏替换后,成为 int* peach, cheese; => 等价于 int *peach, cheese; => 显然 peach是个指针变量,但cheese就是一个纯粹的整形变量