博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
#define VS typedef
阅读量:4107 次
发布时间:2019-05-25

本文共 1356 字,大约阅读时间需要 4 分钟。

#define VS typedef

1.        #define 预处理指令 ,是宏定义语句。在编译预处理时进行简单的替换,不作正确性检查,不关含义是否正确照样带入,只有在编译已被展开的源程序时才会发现可能的错误并报错。通常用它来定义常量 ( 包括无参量与带参量 ) ,以及用来实现那些 表面似和善、背后一长串 的宏,例如:

#define PI     3.1415926

程序中的: area=PI*r*r 会替换为 3.1415926*r*r ,如果你把 #define 语句中的数字 9 写成字母 g 预处理也照样带入。

2.        typedef 在编译时处理的 。它常用来定义一个标识符及关键字的别名,是语言编译过程的一部分,但它并不实际分配内存空间,但是 You cannot use the typedef specifier inside a function definition 。例如:

typedef    int       INT;

typedef    int       ARRAY[10];

typedef   (int*)   pINT;

typedef 可以增强程序的可读性,以及标识符的灵活性,但它也有 非直观性 等缺点。

 

3.        typedef #define 的区别

从以上的概念便也能基本清楚, typedef 只是为了增加可读性而为标识符另起的新名称 ( 仅仅只是个别名 ) ,而 #define 原本在 C 中是为了定义常量,到 C++ const enum inline 的出现使它也渐渐成为了起别名的工具。有时很容易搞不清楚与 typedef 两者到底该用哪个好,如 #define INT int 这样的语句,用 typedef 一样可以完成,用哪个好呢?我主张用 typedef ,因为在早期的许多 C 编译器中这条语句是非法的,只是现今的编译器又做了扩充。为了尽可能地兼容,一般都遵循 #define 定义 可读 的常量以及一些宏语句的任务,而 typedef 则常用来定义关键字、冗长的类型的别名。

宏定义只是简单的字符串代换(原地扩展),而 typedef 则不是原地扩展,它的新名字具有一定的封装性,以致于新命名的标识符具有更易定义变量的功能。

      

       示例 1

typedef    (int*)      pINT;

#define    pINT2    int*

效果相同?实则不同!实践中见差别: pINT a,b; 的效果同 int *a; int *b; 表示定义了两个整型指针变量。而 pINT2 a,b; 的效果同 int *a, b; 表示定义了一个整型指针变量 a 和整型变量 b

 

       示例 2

typedef int * pint;

#define PINT int *

const pint p;   //p 不可更改,但 p 指向的内容可更改

const PINT p;  //p 可更改,但是 p 指向的内容不可更改。

 

pint 是一种指针类型 const pint p 就是把指针给锁住了 p 不可更改而 const PINT p const int * p 锁的是指针 p 所指的对象。

4.        #define 不是语句不要在行末加分号,否则会连分号一块置换。

转载地址:http://gvtsi.baihongyu.com/

你可能感兴趣的文章
Edit Distance 字符串距离(重重)
查看>>
Gray Code 格雷码
查看>>
对话周鸿袆:从程序员创业谈起
查看>>
web.py 0.3 新手指南 - 如何用Gmail发送邮件
查看>>
web.py 0.3 新手指南 - 实时语言切换
查看>>
web.py 0.3 新手指南 - RESTful doctesting using app.request
查看>>
web.py 0.3 新手指南 - 使用db.query进行高级数据库查询
查看>>
web.py 0.3 新手指南 - 多数据库使用
查看>>
一步步开发 Spring MVC 应用
查看>>
python: extend (扩展) 与 append (追加) 的差别
查看>>
「译」在 python 中,如果 x 是 list,为什么 x += "ha" 可以运行,而 x = x + "ha" 却抛出异常呢?...
查看>>
谷歌阅读器将于2013年7月1日停止服务,博客订阅转移到邮箱
查看>>
浅谈JavaScript的语言特性
查看>>
Lua解释器
查看>>
Notepad++ 16进制编辑功能
查看>>
N沟道增强型MOS管双向低频开关电路
查看>>
VS2010点滴——不能将参数 1 从“const char [11]”转换为“LPCWSTR”
查看>>
error C2065: “CString”: 未声明的标识符
查看>>
Building MFC application with /MD[d] (CRT dll version)requires MFC shared dll version~~~~
查看>>
error C2668: “pow”: 对重载函数的调用不明确
查看>>