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就是一个纯粹的整形变量

 

posted on 2024-02-05 15:34  新西兰程序员  阅读(41)  评论(0编辑  收藏  举报