一、typedef用法
typedef常用来定义一个标识符及关键字的别名,它生效是在语言编译过程,但它并不实际分配内存空间。typedef可以增强程序的可读性,以及标识符的灵活性,但它也有“非直观性”的缺点。举例如下:
a、先声明一个类型
typedef (int*) pINT;
b、使用这个类型
pINT a;
在编译的时候,定义了一个指向整型变量的指针。
二、define的用法
“#define”为宏定义语句,它在预编译时将所定义的语句展开。举例如下:
a、先定义一个宏
#define pINT int *
b、使用这个宏
pINT a;
在预编译阶段,将宏展开为“int *”,在编译阶段定义一个指向整型变量的指针。
三、typedef与define的区别和联系
1、 两者发生作用的时机
typedef 作用在编译阶段
define 作用在预编译阶段
2、 两者的用途
typedef
为一种数据类型定义一个新名字。这里的数据类型包括内部数据类型(int,char等)和自定义的数据类型(struct等)。
define
(1) 方便程序的修改
使用简单宏定义可用宏代替一个在程序中经常使用的常量,这样在将该常量改变时,不用对整个程序进行修改,只修改宏定义的字符串即可,而且当常量比较长时, 我们可以用较短的有意义的标识符来写程序,这样更方便一些。
(2) 提高程序的运行效率
使用带参数的宏定义可完成“函数调用所完成的功能”,又能减少系统开销,提高运行效率。
3、 两者的联系
typedef能完成的功能,define也能完成,从“1、typedef用法”和“2、#define的用法”所举的例子
中可以看出。
不过,我想说的是:尽管define能完成属于typedef分内的事,但是尽量不要让define越俎代庖。
四、typedef与define区别举例
测试程序
#include <stdio.h> 3 typedef int * pINT;
4 #define INTP int * 7 int main()
8 {
9 int a1;
10 int a2;
11 const pINT p1 = &a1;
12 const INTP p2 = &a1; 14 p1 = &a2;
*p1 = a2; 17 *p2 = a2;
p2 = &a2; return ;
}
编译错误提示
Compiling...
program.cpp
G:\C\const_test\program.cpp(14) : error C2166: l-value specifies const object
G:\C\const_test\program.cpp(17) : error C2166: l-value specifies const object
执行 cl.exe 时出错. program.obj - error(s), warning(s)
提示的错误信息无法是说const变量,被赋予了新值,这是不允许的。
1、红色的错误(typedef引起的错误)
typedef int * pINT; 给(int *)起了一个别名pINT
const pINT p1 = &a1; 定义了一个常指针p1,并指向a1
p1 = &a2; 更改p1的指向的时候,提示错误
2、绿色的错误(define引起的错误)
#define INTP int * 定义宏INTP
const INTP p2 = &a1; 定义了一个指向常整型变量a1的指针
*p2 = a2; 更改指向整型变量a1值的时候,提示错误
3、分析所得
<1> typedef
typedef int * pINT;
const pINT p1 = &a1;
相当于
int * const p1 = &a1
<2> define
#define INTP int *
const INTP p2 = &a1;
相当于
const int * 或者int const *
<3> 总结
可以看到typedef对(int *)有一种包装作用,而define完全就是替换展开。