typedef与define

一、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区别举例

 测试程序

 1 #include <stdio.h>
 2 
 3 typedef int * pINT;
 4 #define INTP int *
 5 
 6 
 7 int main()
 8 {
 9     int a1;
10     int a2;
11     const pINT p1 = &a1;
12     const INTP p2 = &a1;
13     
14     p1 = &a2;
15     *p1 = a2;
16 
17     *p2 = a2;
18     p2 = &a2;
19 
20     return 0;
21 }

编译错误提示

Compiling...
program.cpp
G:Cconst_testprogram.cpp(14) : error C2166: l-value specifies const object
G:Cconst_testprogram.cpp(17) : error C2166: l-value specifies const object
执行 cl.exe 时出错.

program.obj - 1 error(s), 0 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完全就是替换展开。

参考网页:typedef和#define的用法与区别

 

原文地址:https://www.cnblogs.com/amanlikethis/p/3610809.html