• c++中typedef、define、const、inline之间的区别


    1.typedef和#define的区别

    typedef int* pInt;
    int a = 1, b = 2;
    const pInt p1 = &a;    //p1是常量指针
    pInt const p2 = &b;    //p2是常量指针
    //这里的const就是拿来修饰p1、p2的,跟pInt没关系

    1)作用:typedef定义了一个新的类型别名,而#define(宏定义)只是简单的替换

    2)类型安全检查:用typedef定义时有类型安全检查,而#define是简单的替换,没有类型安全检查(所以容易出错)

    3)处理阶段:typedef在编译阶段处理,而#define是预处理指令,在预编译阶段处理

    4)作用域:typedef在它定义域内有效,而#define一旦定义将不受定义域限制(即使在局部定义也在全局范围内有效)

    5)能否被取消:typedef定义后不能被取消,而#define可以用定义后可以用#undef取消

    void f1()
    {
        #define N 15
        const int n =12;
        cout << N << endl;
    }
    
    void f2()
    {
        cout << N << endl; //正确,N已经定义过,不受定义域限制
        #undef N
        cout << N << endl; //错误,N的定义被取消
        cout << n << endl; //错误,n定义域只在f1函数中
    }

    6)与指针有关的操作:

    #define pD int*
    typedef int* pT;
    int a = 1, b = 2;
    const pT p1 = &a;    //p1是常量指针
    pT const p2 = &b;    //p2是常量指针
    //pT是一种类型,这里的const是拿来修饰p1、p2的,跟pT没关系
    
    const pD p3 = &a;    //p3是指向常量的指针
    pD const p4 = &b;    //p4是常量指针
    //pD是简单的替换
    
    pD p5, p6;    //p5是指针,p6是int变量
    pT p7, p8;    //p7和p8都是指针

    2.#define和const的区别

    1)两者都可以用来定义只读数据

    2)处理阶段:#define是预处理指令,在预编译阶段处理,而const在编译阶段处理

    3)类型安全检查:#define是简单的替换,没有类型安全检查,而const常量有具体的类型,类型安全检查,所以c++鼓励使用const来替代#define(effective c++条款2:尽量以const, enum, inline替换#define)

    4)能否被取消:#define定义后可以用#undef取消,const定义后不能被取消

    5)赋值时的空间分配:多次使用这两个关键字定义的常量给其他变量赋值时,const定义的常量在程序运行过程中只有一份拷贝,而#define定义的常量在内存中有多份拷贝

    #define PI 3.141 //
    const int P = 3.14; //此时并不给P分配内存,而是将P放入符号表
    double i = P; //此时才为Pi分配内存,以后不再分配  
    double I = PI; //进行宏替换后,分配内存  
    double j = P; //没有内存分配  
    double J = PI; //进行宏替换后,又一次分配内存

    3.#define和inline的区别

    1)作用:#define是关键字,是简单的替换,而inline是函数,inline(内联)函数对编译器提出建议,是否进行宏替换,编译器有权拒绝

    2)处理阶段:#define是预处理指令,在预编译阶段处理,而inline在编译阶段处理

    3)类型安全检查:#define没有类型安全检查,而inline类型安全检查

  • 相关阅读:
    深入浅出MySQL灵魂十连问,你真的有把握吗?
    sharding-jdbc
    计算表数据大小,加查询表数据大小情况sql
    高并发下数据库分库分表面试题整理
    干货|一次MySQL两千万数据大表的优化过程,三种解决方案
    CompletableFuture 使用详解
    mysql innodbd 锁
    mysql : show processlist 详解
    微信支付V2.0-python
    python代码打包加密
  • 原文地址:https://www.cnblogs.com/Joezzz/p/10267967.html
Copyright © 2020-2023  润新知