在C/C++中,我们平时写程序可能经常会用到typedef关键字和#define宏定义命令,在某些情况下使用它们会达到相同的效果,但是它们是有实质性的区别,一个是C/C++的关键字,一个是C/C++的宏定义命令,typedef用来为一个已有的数据类型起一个别名,而#define是用来定义一个宏定义常量。下面谈谈两者在实际使用中应当注意的地方。

1.typedef关键字

typedef是用来声明类型别名的,在实际编写代码过程使用typedef往往是为了增加代码的可读性。它可以为一串很长的类型名起一个别名,那么使用这个别名可以达到与原类型名相同的效果。

如:

typedef int INT;
typedef char CHAR;

就为int和char分别起了一个别名,那么在程序中使用INT a;和int a;达到的效果是等同的。在使用typedef时应注意一下几点:

1)typedef是为一个数据类型起一个新的别名,如typedef int INT;那么要告诉我的是INT表示整型,typedef int* INTPTR;则告诉我们INTPTR是一个指向整型变量的指针类型,这点与#define是决然不同的,#define只是作简单的字符串替换,不表达任何含义。如:

#define INTPTR1 int*
typedef int* INTPTR2;

INTPTR1 p1,p2;
INTPTR2 p3,p4;

INTPTR1 p1,p2;和INTPTR2 p3,p4;这两句的效果决然不同。INTPTR1 p1,p2;进行字符串替换后变成int* p1,p2;要表达的意义是声明一个指针变量p1和一个整型变量p2;而INTPTR2 p3,p4;由于INTPTR2是具有含义的,告诉我们是一个指向整型数据的指针,那么p3和p4都为指针变量,这句相当于int* p1,*p2;从这里可以看出,进行宏替换是不含任何意义的替换,仅仅为字符串替换;而用typedef为一种数据类型起的别名是带有一定含义的。

再看下面这个例子:

#define INTPTR1 int*
typedef int* INTPTR2;

int a=1;
int b=2;
int c=3;
const INTPTR1 p1=&a;
const INTPTR2 P2=&b;
INTPTR2 const p3=&c;

上述代码中,const INTPTR1 p1表示p1是一个常量指针,即不可以通过p1去修改p1指向的内容,但是p1可以指向其他内容;而对于const INTPTR2 p2,由于INTPTR2表示是一个指针类型,因此用const去限定,表示封锁了这个指针类型,因此p2是一个指针常量,不可使p2再指向其他的内容,但可以通过p2修改其当前指向的内容,INTPTR2 const p3同样声明的是一个指针常量。

2)对于宏定义:

#define INT int
unsigned INT a;

这种用法是可行的;

typedef int INT;
unsigned INT a;

是绝对错误的用法。

2.#define宏定义

#define是一个宏定义命令,用来定义一个常量(包括无参常量和有参常量),它本身并不在编译过程中执行,而是在预处理阶段就已经完成了,因此不作任何正确性检查,只进行不关含义的字符串替换。在使用宏定义时,如果稍不注意就会发生错误,而且这个错误往往是你意想不到的。如:

#define ADD(a,b) a+b

int i=1;
int j=2;
int k=3;
int s=ADD(i,j)*k;

程序可能想求算的是(i+j)*k的结果,然而这段程序并没有达到这种效果,由于宏替换只是进行简单的字符串替换,那么ADD(i,j)*k相当于i+j*k,并不是想象中的(i+j)*k。

转载于:https://www.cnblogs.com/rooney/archive/2012/07/17/2596596.html

浅谈c/c++typedef和#define区别[转]相关推荐

  1. mybatis与php,浅谈mybatis中的#和$的区别

    浅谈mybatis中的#和$的区别 发布于 2016-07-30 11:14:47 | 236 次阅读 | 评论: 0 | 来源: 网友投递 MyBatis 基于Java的持久层框架MyBatis 本 ...

  2. C语言 typedef 和 define 区别 - C语言零基础入门教程

    目录 一.typedef 简介 1.typedef 简化复杂的类型声明 A.定义普通变量 B.定义函数指针 C.定义结构体 2.定义与平台无关的类型 二.define 简介 三.typedef 和 d ...

  3. 浅谈Android onTouchEvent 与 onInterceptTouchEvent的区别详解

    浅谈Android onTouchEvent 与 onInterceptTouchEvent的区别详解 本篇文章小编为大家介绍,Android onTouchEvent 与 onInterceptTo ...

  4. 什么是proxy服务器代理?怎么设置代理服务器?浅谈服务器代理与VPN的区别

    服务器 服务器是计算机的一种,它比普通计算机运行更快.负载更高.价格更贵.服务器在网络中为其它客户机(如PC机.智能手机.ATM等终端甚至是火车系统等大型设备)提供计算或者应用服务.服务器具有高速的C ...

  5. 浅谈机器学习-回归与分类的区别

    前言 机器学习的主要任务便是聚焦于两个问题:分类和回归.本文将浅谈下两者的区别. 区别 回归会给出一个具体的结果,例如房价的数据,根据位置.周边.配套等等这些维度,给出一个房价的预测.         ...

  6. 浅谈云计算与超融合的区别和联系

    在项目设计阶段遇到了云计算和超融合的实际运用的问题,虽然自己本身不负责设计,但是对于云计算与超融合的区别也不了解,故查了一些资料,由此谈一下自己的理解,内容干干巴巴不瞎扯,不当之处欢迎交流指正. 在谈 ...

  7. 普通计算机网络和工业控制网络的区别,浅谈工控电脑和普通电脑的区别

    工控电脑就是工业控制用的计算机,是计算机的一种,主要结构和工作原理和普通电脑没有什么区别,但是在设计上区别比较大. 工控机 机箱不同: 工控机箱采用钢结构,封闭式设计,内部有大量固定条,有较高的防磁. ...

  8. 浅谈session,cookie,sessionStorage,localStorage的区别及应用场景

    浏览器的缓存机制提供了可以将用户数据存储在客户端上的方式,可以利用cookie,session等跟服务端进行数据交互. 一.cookie和session cookie和session都是用来跟踪浏览器 ...

  9. [转]浅谈CMD和win powershell的区别

    1.前言:本文给大家简单描述了一下POWERSHELL和CMD的区别,简单的说,Powershell是cmd的超集,换句话说,cmd能做的事情,Powershell都能做,但是Powershell还能 ...

最新文章

  1. [HDOJ2819]Swap(二分图最大匹配, 匈牙利算法)
  2. MYSQL——常用运算符和函数
  3. Velocity语法使用总结
  4. android studio 修改包名_android逆向笔记之初学者常用adb命令
  5. 使用ASP.NET Core 3.x 构建 RESTful API - 4.1 面向外部的Model
  6. PMP读书笔记(第2章)
  7. 开源数据分析工具 CyberChef
  8. 基于Hadoop架构下的FineBI大数据引擎技术原理
  9. AJAX无刷新搜索,即输即得(未完善…)
  10. Spring web项目中web.xml常用的配置
  11. jni数组使用(二)
  12. 华为手机耳机sws音效是什么_耳机sws音效是什么 华为手机耳机sws音效是什么
  13. 项目过程中的部分逻辑
  14. vsftpd的参数说明和虚拟用户配置
  15. iPhoneX、iPhoneXS、iPhoneXR、iPhoneXSMax屏幕适配
  16. 解密搭建平台赚钱的方法一:详解搭建网站收入的几个来源
  17. PV-RCNN: Point-Voxel Feature Set Abstraction for 3D Object Detection阅读
  18. 小心金蝶专业版16.0后门木马勒索后门程序kissme.dll文件
  19. APS系统到底是什么?为什么许多企业纷纷选择APS系统?
  20. 杭州保俶塔实验机器人_资讯 | 智慧与挑战!2017年西湖区中小学生科技节智能机器人比赛成绩出炉啦...

热门文章

  1. python的scrapy框架的安装_Python爬虫基础(四)--Scrapy框架的安装及介绍
  2. Kubernetes的Device Plugin机制源码解析
  3. (转)fatal error C1853: precompiled header file is from a previous version of the compiler, or the pre
  4. 使用PDB调试Python程序的完整实践
  5. python学习笔记(六)循环、迭代
  6. Rdd没法调用toDF原因
  7. 聊聊JVM(六)理解JVM的safepoint
  8. 【原】Linux设备网络硬件管理
  9. Swoole 实现简单的路由
  10. 资源集 - 收藏集 - 掘金