typedef 和 #define 的区别
本文已迁移至:
http://www.danfengcao.info/c/c++/2014/02/25/difference-between-define-and-typedef.html
typedef 和#define 都常用来定义一个标识符及关键字的别名,但他们之间有关键的区别。
typedef 是语言编译过程的一部分;
#define是宏定义语句,它本身并不在编译过程中进行,而是在这之前的预处理过程就已经完成了。
要理解两者的关键区别,可以这么来考虑:
把typedef 看成是一种彻底的"封装"类型,相当于产生了一个新的变量类型(这点与struct 类似,待会会与struct 进行类比来增进理解)。而#define 仅仅是进行宏文本替换。
typedef 和 #define 的区别体现在两个方面:
首先, 可以用其他类型说明符对宏类型名进行扩展,但typedef 所定义的类型名却不能进行扩展。
如下:
#define peach int
unsigned peach i; //没问题,可以这么使用。 typedef int banana;
unsigned banana i; //错误,非法!
#define 仅仅是进行宏文本替换,它并没有产生新的变量类型。以上面代码为例,在预处理阶段, peach 重新被替换为 int, 故可在peach 前面加unsigned;
而typedef 的工作方式则和#define完全不一样,它相当于产生了一个新的变量类型,这个新的变量类型前面不能再进行扩展。这和struct 类型类似,定义了一个struct 也相当于产生了一个新的变量类型,而我们从不会见到类似于 unsigned struct student a; 这种声明。
第二个区别,在连续几个变量的声明中,用typedef 定义的类型能够保证声明中的所有变量均为同一种类型,而用#define 则无法保证。
如下:
#define intp int *
intp a, b; //经过宏扩展,第二行变为:
int * a, b; //a是一个指向int变量的指针变量, b是一个int型变量! typedef int * int_p;
int_p c, d; //c, d都是指向int变量的指针变量!
以上述代码为例,#define仅仅是进行宏替换,在预处理阶段intp被替换为 int *,这显然只能声明a是个指针变量, 而b是int型变量。typedef则相当于定义了一个新的变量类型,能对c、d都起作用。同样与struct作类比, 对于 struct student e,f; e和f都被声明是student类型的变量。
#---------------------------------------------------------------------------------#
参考文献
《C专家编程》, Peter Van Der Linden 著, 徐波 译
typedef 和 #define 的区别的更多相关文章
- typedef与#define的区别
1. typedef typedef故名思意就是类型定义的意思,但是它并不是定义一个新的类型而是给已有的类型起一个别名,在这一点上与引用的含义类似,引用是变量或对象的别名,而typedef定义的是类 ...
- typedef 和define的区别
总结一下typedef和#define的区别 1.概念 #define 它在编译预处理时进行简单的替换,不作正确性检查.它是预处理指令. typedef 它在自己的作用域内给一个已经存在的类型一个别名 ...
- typedef 与define 的区别
typedef和#define的用法与区别 typedef和#define的用法与区别 一.typedef的用法 在C/C++语言中,typedef常用来定义一个标识符及关键字的别名,它是语言编译 ...
- typedef和#define的区别
转自:http://www.cnblogs.com/kerwinshaw/archive/2009/02/02/1382428.html 一.typedef的用法在C/C++语言中,typedef常用 ...
- typedef 与 #define的区别
typedef 与 #define的区别 整理于一篇经典blog,经典原文地址http://www.cnblogs.com/csyisong/archive/2009/01/09/1372363.ht ...
- C++中typedef和define的区别
typedef和#define的用法与区别 一.typedef的用法 在C/C++语言中,typedef常用来定义一个标识符及关键字的别名,它是语言编译过程的一部分,但它并不实际分配内存空间,实例像: ...
- C++ 系列:typedef 和 #define 的区别
总结一下typedef和#define的区别 1.概念 #define 它在编译预处理时进行简单的替换,不作正确性检查.它是预处理指令. typedef 它在自己的作用域内给一个已经存在的类型一个别名 ...
- typedef 与 define 的区别
1.区别 (1)定义.执行时间.作用域 定义.执行时间: #define pchar char * typedef char *pchar; 定义的格式差别,显而易见的,要注意,define 是不能存 ...
- C语言中的typedef跟define的区别
今天用C语言练习时涉及到了typedef和define的使用问题,那么他们的区别是啥?这种情况下为什么要用typedef?哪种情况下为什么要用define呢? 学习C的时候的你是否考虑过这个问题呢? ...
随机推荐
- Azure Application Gateway (4) 设置URL路由 - PowerShell
<Windows Azure Platform 系列文章目录> 本文将介绍如果使用Azure PowerShell,创建Azure Application Gateway URL Rout ...
- Spring-Boot - 初步搭建
official document:http://projects.spring.io/spring-boot/ 项目代码: https://github.com/chenxing12/springb ...
- 用浏览器(支持WebSocket)和node-inspector 调试后端(CoffeeScript,Typescript)代码
调试效果 配置 npm安装node-inspector: $ npm install -g node-inspector 配置gulp,gulp可以用 gulp-node-inspector 或 用g ...
- 3.Code-First 约定(EF Code-First系列)
前面,我们已经了解了Code-First利用领域类,怎么为我们创建数据库的简单示例.现在我们来学习一下Code-First约定吧. 什么是约定 约定说白了,就是基于一套规矩办事,这里就是基于你定义好的 ...
- jQuery AutoComplete在AJAX UpdatePanel环境中PostBack之后无法工作
前些日子,Insus.NET有实现<ASP.NET MVC使用jQuery实现Autocomplete>http://www.cnblogs.com/insus/p/5638895.htm ...
- Post方式打开新窗口
最近在做一个跟ERP相连的领料网站,用到POST的方法打开新窗口来打印报表 代码转别人的,在这里记一下: javascript代码 function openPostWindow(url, data1 ...
- 简单Java类与XML之间的转换
需要的jar包:xmlpull_1_0_5.jar,xstream-1.4.1.jar) 1.工具类XstreamUtil package com.learn.util; import com.tho ...
- Java基础学习总结 -- 多线程的实现
目录: 继承Thread类 start()方法实现多线程的原理 实现Runnable接口 Thread类 与 Runnable接口 的联系与区别 多线程的实现方法: 继承Thread类 实现Runna ...
- CSS Hack解决浏览器IE部分属性兼容性问题
1.Css Hack 不同厂商的流览器或某浏览器的不同版本(如IE6-IE11,Firefox/Safari/Opera/Chrome等),对CSS的支持.解析不一样,导致在不同浏览器的环境中呈现出不 ...
- 关于图片的PNG与JPG、JIF格式
一:GIF(Graphics Interchange Format) 简介 GIF图形交换格式是一种位图图形文件格式,以8位色(即256种颜色)重现真彩色的图像. 它实际上是一种压缩文档,采用LZW压 ...