本文共 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/