• 面试问题5:const 与 define 宏定义之间的区别


    问题描述:const 与 define 宏定义之间的区别

    (1) 编译器处理方式不同
         define宏是在预处理阶段展开;
         const常量是编译运行阶段使用;

    (2) 类型和安全检查不同
         define宏没有类型,不做任何类型检查,仅仅是展开;
         const常量有具体的类型,在编译阶段会执行类型检查;

    (3) 存储方式不同
         define宏仅仅是展开,有多少地方使用,就展开多少次,不会分配内存;
         const常量会在内存中分配(可以是堆中也可以是栈中);

    利用宏的优点:

    1)让代码更简洁明了

    一般来说,宏的名字更要注重有明确直观的意义,有时宁可让它长点。

    2)方便代码维护

    对宏的处理,在编译过程中称为“预处理”。也就是说在正式编译前,编译器必须先将代码出现的宏,用其相应的宏值替换,这个过程有点你我在文字处理软件中的查找替换。所以在代码中使用宏表达常数,归根结底还是使用了立即数,并没有明确指定这个量的类型。

    利用const:

    常量定义的格式为:

    const 数据类型 常量名 = 常量值;

    而const定义的常量具有数据类型,定义数据类型的常量便于编译器进行数据检查,使程序可能出现错误进行排查。常量必须一开始就指定一个值,然后,在以后的代码中,我们不允许改变此常量的值。

    define定义表达式时要注意“边缘效应”,例如如下定义:
    #define N 2+3 //我们预想的N值是5,我们这样使用N,int a = N/2; //我们预想的a的值是2.5,可实际上a的值是3.5原因在于在预处理阶段,编译器将 a = N/2处理成了 a = 2+3/2;这就是宏定义的字符串替换的“边缘效应”因此要如下定义:#define N (2+3)

    举例:

    1 #include <bits/stdc++.h>
    2 #define N 2+3
    3 using namespace std;
    4 
    5 int main()
    6 {
    7     double ans = N/2.0;
    8     printf("%lf
    " ,ans );
    9 }

    GCC运行结果:

  • 相关阅读:
    yii框架中的各种小问题
    yii框架无限极分类的做法
    yii框架中的下拉菜单和单选框
    yii框架定时任务的操作
    yii框架里DetailView视图和GridView的区别
    git的使用(1)
    mysql 连接问题
    PHP字符串函数
    phpdocmentor 生成php 开发文档(转载)
    使用Nginx的X-Accel-Redirect实现大文件下载
  • 原文地址:https://www.cnblogs.com/zpfbuaa/p/5330283.html
Copyright © 2020-2023  润新知