C++中typedef和#define简介

本文基于《C++ Primer(第5版)》和网上博客,整理而成。

一、类型别名

 类型别名是一个名字,它是某种类型的同义词,有两种方法可用于定义类型别名:typedef、using。

1、关键字typedef

 typedef 它在自己的作用域内给一个已经存在的类型一个别名,编译阶段,会进行类型检查。

1 typedef double wages;   //wages是double的同义词
2 wages hourly;           //等价于double hourly;

注意:使用typedef时,最后要加分号,另外,含有typedef的声明语句定义的不再是变量而是类型别名。

(1)指针、常量和类型别名

 若某个类型别名指代的是复合类型或常量时,要特别注意。

1 typedef char * pstring;
2 pstring a,b;            //a,b都是指向char的指针
3 const pstring cstr=0;   //cstr是指向char的常量指针

针对pstring,其基本数据类型是指针,对第三行代码它实际上相当于char*   const。故不能直接将类型别名替换成它本来的样子,来理解该语句的含义。

注:const和typedef一起出现时,typedef不是仅仅简单的字符串替换。

(2)返回数组指针

1 typedef int arrT[10];   //arrT是一个类型别名,它表示的类型是
2                         //含有10个整数的数组
3 arrT *func(int i);      //func返回一个指向还有10个整数的数组指针

二、#define

 1、define是预处理指令的一种,它用来定义宏,宏只是一个简单的替换,将宏变量所对应的值替换。不做正确性检查,不关含义是否正确照样带入,只有在编译已被展开的源程序时才会发现可能的错误并报错。

1 #define N 5
2 int main()
3 {
4     cout<<N;  //输出5
5     return 0;
6 }

2、define的容易出现的问题

(1)如:想计算a=10*10,结果输出35

1 #define N 5+5
2 int main()
3 {
4     int a=N*N;
5     cout<<a;        //输出35
6     return 0;
7 }

这是因为define只是简单的替换,所以,a=5+5*5+5。若想计算10*10,可将第一行改为

1 #define N (5+5)

 

另外,两者的作用域不同

1、#define 无论在哪定义过,在其它的地都可以使用
2、typedef 只能在定义的作用域内使用

本文只是简单的说一说,不详细的地方,请见参考。

Ref:

http://www.cnblogs.com/li-peng/p/3853818.html

http://www.cnblogs.com/kerwinshaw/archive/2009/02/02/1382428.html

http://blog.csdn.net/luoweifu/article/details/41630195

http://www.cnblogs.com/182-7167-2685/p/5125708.html

 

posted @ 2017-08-03 21:13  王大咩的图书馆  阅读(342)  评论(0编辑  收藏  举报