• 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的用法与区别

     

  • 相关阅读:
    CDN实现原理
    openstack测试集群扩容配置
    ELK5.2.2自动化部署脚本
    Python多线程
    Python反射
    OpenStack快照分析:(三)从磁盘启动云主机离线(在线)快照分析
    OpenStack快照分析:(二)从镜像启动的云主机离在线快照分析
    OpenStack快照分析:(一)从镜像启动的云主机离线快照分析
    Python元编程
    Python源码阅读:对象
  • 原文地址:https://www.cnblogs.com/amanlikethis/p/3610809.html
走看看 - 开发者的网上家园