zoukankan      html  css  js  c++  java
  • typedef 与 define 的区别

    1、区别


    (1)定义、执行时间、作用域

    定义、执行时间:

    #define pchar char *
    typedef char *pchar;

        定义的格式差别,显而易见的,要注意,define 是不能存在分号的(文本替换),而typedef 是存在逗号的(类型的重命名)。

        同时,define 由预处理器进行处理,只做简单的文本替换的工作,不做任何检查(正确性检查、作用域检查、类型检查)

    typedef 是给一个已经存在类型的别名,在编译时候处理。

    作用域:

        define 只要一次定义,那么就 没有作用域的限制,在哪都可以被使用:

    void func1()  
    {  
        #define HW "HelloWorld";  
    }  
      
    void func2()  
    {  
        string str = HW;  
        cout << str << endl;  
    }

        typedef 则不然,存在自己的作用域。

    void func1()  
    {  
        typedef unsigned int UINT;  
    }  
      
    void func2()  
    {  
        UINT uValue = 5;//error C2065: 'UINT' : undeclared identifier  
    }

    (2)对指针的操作

    #define pint int*
    typedef int* ppint;
    pint a1, b1;
    ppint c1, d1;

       上面的定义等价于

    int * a1;
    int b1;
    int * c1;
    int * d1;

      对于处于定义指针的方式来说,还是使用 typedef 靠谱。


    2、typedef 与 const 的结合

    当:

    typedef int * pint;
    int a = 1;
    const pint p1 = &amp;a;
    *p1 = 2;
    cout &lt;&lt; *p1 &lt;&lt; endl;
    打印的结果是: 2

        可见: const pint p1; 是相当于 int * const p1,也就是 p1 是const 指针,p1 指向地址是常量(不能改变),所以定义的时候就需要被初始化,但是p1 所知的内容是可以被修改的,修改变为 2 打印输出。

        可见,即使是换了顺序,都是相当于: int * const p1; 也就是不论顺序是怎么挑换都是一个定义 const 指针。

    typedef int * pint;
    int a = 1;
    pint const  p1 = &amp;a;
    *p1 = 2;
    cout &lt;&lt; *p1 &lt;&lt; endl;
    打印: 2

        如果非要定义出一个 const int * 类型的话,只能:

    typedef const int * cpint;

        只有这个方法定义出来的才是,才可以定义出一个指向 const 的指针。

    3、typedef 作用

    (1)简化复杂的类型说明

    int(*pfunc)(int,int)
    使用typedef:
    typedef int(*pfunc)(int,int)
    使用: 
    pfunc ptr = 函数名;


    (2)定义与平台无关的类型

        数据类型的定义,一般都是与平台有关的。对于大型的代码的时候,如果定义的都是:long double a;  但是当平台不支持 long long 类型的时候,要进入代码体一个个查找,那真是要命:

    typedef long double REAL;

        在跨平台的时候,只需要修改一次就全部解决了。

    4、封装程度不一样

    typedef 和 define 封装程度是是不一样的。typedef 可以看成是一种彻底的“封装” 类型,也就是说,在对 typedef 声明之后,就不能再往里面添加别的东西了。而 define 则不然,他只是文本替换工作而已,所以声明之后还是可以进行封装的。

    #define zhengxing1 int
    unsigned  zhengxing1 i;

    编译器正确通过。

    typedef int zhengxing2;
    unsigned zhengxing2 j;
    编译器是编译不过的。
  • 相关阅读:
    poj 3070 矩阵快速乘
    将数字放大显示
    hdu 火车入队 stack
    linq to Entity 数据库除了有主键还有唯一索引,是不是不能更新
    整理:C#写ActiveX, 从代码到打包到签名到发布的示例
    Java—FileOperator
    第二章-递归与分治策略
    第四章-贪心算法
    第五章-回溯法
    Linux中C程序调试、makefile
  • 原文地址:https://www.cnblogs.com/qxj511/p/5081797.html
Copyright © 2011-2022 走看看