浅谈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区别[转]相关推荐
- mybatis与php,浅谈mybatis中的#和$的区别
浅谈mybatis中的#和$的区别 发布于 2016-07-30 11:14:47 | 236 次阅读 | 评论: 0 | 来源: 网友投递 MyBatis 基于Java的持久层框架MyBatis 本 ...
- C语言 typedef 和 define 区别 - C语言零基础入门教程
目录 一.typedef 简介 1.typedef 简化复杂的类型声明 A.定义普通变量 B.定义函数指针 C.定义结构体 2.定义与平台无关的类型 二.define 简介 三.typedef 和 d ...
- 浅谈Android onTouchEvent 与 onInterceptTouchEvent的区别详解
浅谈Android onTouchEvent 与 onInterceptTouchEvent的区别详解 本篇文章小编为大家介绍,Android onTouchEvent 与 onInterceptTo ...
- 什么是proxy服务器代理?怎么设置代理服务器?浅谈服务器代理与VPN的区别
服务器 服务器是计算机的一种,它比普通计算机运行更快.负载更高.价格更贵.服务器在网络中为其它客户机(如PC机.智能手机.ATM等终端甚至是火车系统等大型设备)提供计算或者应用服务.服务器具有高速的C ...
- 浅谈机器学习-回归与分类的区别
前言 机器学习的主要任务便是聚焦于两个问题:分类和回归.本文将浅谈下两者的区别. 区别 回归会给出一个具体的结果,例如房价的数据,根据位置.周边.配套等等这些维度,给出一个房价的预测. ...
- 浅谈云计算与超融合的区别和联系
在项目设计阶段遇到了云计算和超融合的实际运用的问题,虽然自己本身不负责设计,但是对于云计算与超融合的区别也不了解,故查了一些资料,由此谈一下自己的理解,内容干干巴巴不瞎扯,不当之处欢迎交流指正. 在谈 ...
- 普通计算机网络和工业控制网络的区别,浅谈工控电脑和普通电脑的区别
工控电脑就是工业控制用的计算机,是计算机的一种,主要结构和工作原理和普通电脑没有什么区别,但是在设计上区别比较大. 工控机 机箱不同: 工控机箱采用钢结构,封闭式设计,内部有大量固定条,有较高的防磁. ...
- 浅谈session,cookie,sessionStorage,localStorage的区别及应用场景
浏览器的缓存机制提供了可以将用户数据存储在客户端上的方式,可以利用cookie,session等跟服务端进行数据交互. 一.cookie和session cookie和session都是用来跟踪浏览器 ...
- [转]浅谈CMD和win powershell的区别
1.前言:本文给大家简单描述了一下POWERSHELL和CMD的区别,简单的说,Powershell是cmd的超集,换句话说,cmd能做的事情,Powershell都能做,但是Powershell还能 ...
最新文章
- [HDOJ2819]Swap(二分图最大匹配, 匈牙利算法)
- MYSQL——常用运算符和函数
- Velocity语法使用总结
- android studio 修改包名_android逆向笔记之初学者常用adb命令
- 使用ASP.NET Core 3.x 构建 RESTful API - 4.1 面向外部的Model
- PMP读书笔记(第2章)
- 开源数据分析工具 CyberChef
- 基于Hadoop架构下的FineBI大数据引擎技术原理
- AJAX无刷新搜索,即输即得(未完善…)
- Spring web项目中web.xml常用的配置
- jni数组使用(二)
- 华为手机耳机sws音效是什么_耳机sws音效是什么 华为手机耳机sws音效是什么
- 项目过程中的部分逻辑
- vsftpd的参数说明和虚拟用户配置
- iPhoneX、iPhoneXS、iPhoneXR、iPhoneXSMax屏幕适配
- 解密搭建平台赚钱的方法一:详解搭建网站收入的几个来源
- PV-RCNN: Point-Voxel Feature Set Abstraction for 3D Object Detection阅读
- 小心金蝶专业版16.0后门木马勒索后门程序kissme.dll文件
- APS系统到底是什么?为什么许多企业纷纷选择APS系统?
- 杭州保俶塔实验机器人_资讯 | 智慧与挑战!2017年西湖区中小学生科技节智能机器人比赛成绩出炉啦...
热门文章
- python的scrapy框架的安装_Python爬虫基础(四)--Scrapy框架的安装及介绍
- Kubernetes的Device Plugin机制源码解析
- (转)fatal error C1853: precompiled header file is from a previous version of the compiler, or the pre
- 使用PDB调试Python程序的完整实践
- python学习笔记(六)循环、迭代
- Rdd没法调用toDF原因
- 聊聊JVM(六)理解JVM的safepoint
- 【原】Linux设备网络硬件管理
- Swoole 实现简单的路由
- 资源集 - 收藏集 - 掘金