#define和const的区别

2023-05-16

这个区别用从几个角度来说:

角度1:
就定义常量说的话:
const 定义的常数是变量 也带类型, #define 定义的只是个常数 不带类型。

角度2:
就起作用的阶段而言:
define是在编译的预处理阶段起作用,而const是在 编译、运行的时候起作用。

角度3:
就起作用的方式而言:
define只是简单的字符串替换,没有类型检查。而const有对应的数据类型,是要进行判断的,可以避免一些低级的错误。
正因为define只是简单的字符串替换会导致边界效应,具体举例可以参考下面代码:

#define N 2+3 //我们预想的N值是5,我们这样使用N
double a = N/2;  //我们预想的a的值是2.5,可实际上a的值是3.0

角度4:
就空间占用而言:
例如:

#define PI 3.14     //预处理后 占用代码段空间
const float PI=3.14;    //本质上还是一个 float,占用数据段空间

角度5:
从代码调试的方便程度而言:
const常量可以进行调试的,define是不能进行调试的,因为在预编译阶段就已经替换掉了

角度6:
从是否可以再定义的角度而言:
const不足的地方,是与生俱来的,const不能重定义,而#define可以通过#undef取消某个符号的定义,再重新定义。

角度7:
从某些特殊功能而言:
define可以用来防止头文件重复引用,而const不能,可以参看下面代码:

//主要把以下代码放在头文件中,可以防止头文件被重复引用
#ifndef xxx//如果没有定义xxx
#define xxx//定义xxx

//这里是你的代码

#endif //结束如果

PS: 下面说一下,头文件被重复引用的弊端:
(1) 有些头文件重复引用只是增加了编译工作的工作量,不会引起太大的问题,仅仅是编译效率低一些,但是对于大工程而言编译效率低下那将是一件多么痛苦的事情。
(2) 有些头文件重复包含,会引起错误,比如在头文件中定义了全局变量(虽然这种方式不被推荐,但确实是C规范允许的)这种会引起重复定义。

角度8:
从某些复杂功能的实现的实现角度来看:
使用define会使得代码看起来非常简单,而const无法实现该功能
例如,MFC在实现六大核心机制中,大量使用了define
1、MFC程序的初始化
2、运行时类型识别(RTTI)
3、动态创建
4、永久保存
5、消息映射
6、消息传递

比如,在实现RTTI功能的时候,定义了如下宏,代码如下:

#define DECLARE_DYNCREATE(class_name) \

    DECLARE_DYNAMIC(class_name)\

    static CObject* PASCALCreateObject();

最后做一下小结:
从上面的各个角度,我们可以看到define和const直接的区别在某个点上同C语言与JAVA语言有一定的相似性,之所以这么说,原因如下:
(1) JAVA中内部对象高度封装,比如对于内存的回收机制而言更是自动完成,不需要程序员多费心;而C语言中,每次我们用指针申请一段空间时,我们都需要仔细考虑,这个指针后面会不会还要使用,现在是不是可以释放了,会不会成为野指针等等问题,所有的内存相关问题都需要程序员自己考虑,但是好处是,C语言可以直接方便的操作内存,这是一把双刃剑,用得好事半功倍,用得不好,内存泄漏,指针跑飞,问题到处都是,就算抓到了dump,用windbg也不好分析(特别是跨模块的情况)
(2) C语言和JAVA语言的差异点类比到define和const,我这里只是想强调define的作用非常强大,虽然它没有类型检测,不能调试,还要考虑边界效应,但是正因为没有类型检测,预编译是就完成,才使得它的使用更加灵活,功能更加强大,如果我们可以善用define,往往可以发挥到意想不到的效果。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

#define和const的区别 的相关文章

  • C#中的readonly与const区别

    xfeff xfeff const 的概念就是一个包含不能修改的值的变量 常数表达式是在编译时可被完全计算的表达式 因此不能从一个变量中提取的值来初始化常量 如果 const int a 61 b 43 1 b是一个变量 xff0c 显然不
  • JS中的const、var和let的区别

    看项目的时候遇到了const和let不知道什么意思 xff0c 特写此博客给记忆力不好的我 1 const定义的变量不可以修改 xff0c 而且补习初始化 xff08 相当于java中的常量 xff09 const a 61 2 正确 a
  • const

    const是一个限定符 xff0c 被const限定的变量其值不会被改变 目录 1 修饰变量 2 修饰指针 3 修饰引用 4 修饰成员函数 5 宏定义 define 和 const 常量 1 修饰变量 指向的变量的值不可改变 xff0c 次
  • #ifndef.#define, #endif 的用法

    文件中的 ifndef define endif 很关键 xff0c 是为了避免多重包含 xff0c 比如如果两个C文件同时包含同一头文件 xff0c 那么就会出现问题 xff0c 所以使用这种方法可以有效避免这种情况 一般用法 xff1a
  • python中define函数_Python中的函数

    函数基础 01 函数的快速体验 1 1 快速体验 所谓函数 xff0c 就是把 具有独立功能的代码块组织为一个小模块 xff0c 在需要的时候 调用 函数的使用包含两个步骤 xff1a 定义函数 封装独立的功能 调用函数 享受 封装的成果
  • 对‘cv::Mat::Mat()’未定义的引用,对‘cv::Mat::clone() const’未定义的引用

    报错如下 xff1a 解决办法 xff1a 在自己的可执行文件链接库的时候在后面加入opencv库即可 xff0c 即加入 OpenCV LIBS xff0c 如下图 xff1a add library sensor setup nodel
  • 指向常数的“万能”指针:const void*在qsort的应用

    qsort函数 函数的原型 xff1a void qsort void base size t num int comparator const void const void 参数解释 xff1a 很简单理解 xff0c 第一个参数就是待
  • void fun() const{}; const void fun(){}; 和void const fun(){}; 的区别?

    const void fun 和void const fun 两个相同 如果采用 34 按址传递方式 34 的函数返回值加const 修饰 xff0c 那么函数返回值 xff08 即地址 xff09 的内容不能被修改 xff0c 该返回值只
  • C和C++的const

    1 C语言的const修饰的变量都有空间 xff0c 全局的在常量区 xff0c 局部的在栈区 xff1b 2 C语言的const修饰的全局变量具有外部链接属性 xff0c extern const int a xff1b 即可使用 xff
  • #ifndef #define #endif 防止头文件被重复引用

    想必很多人都看过 头文件中的 ifndef define endif 防止该头文件被重复引用 但是是否能理解 被重复引用 是什么意思 是不能在不同的两个文件中使用include来包含这个头文件吗 xff1f 如果头文件被重复引用了 xff0
  • php中define()函数和defined…

    原文地址 xff1a php中define 函数和defined 函数的使用 及来防止恶意调用 作者 xff1a 疯子的博客 php中define 函数和defined 函数的使用 define 用来定义常量 xff0c 常量也是全局范围的
  • typedef和define有什么区别

    typedef和define都是替一个对象取一个别名 xff0c 以此增强程序的可读性 xff0c 区别如下 xff1a xff08 1 xff09 原理不同 define是C语言中定义的语法 xff0c 是预处理指令 xff0c 在预处理
  • C语言中的关键字应用技巧(volatile、const、struct/union、_ _预定义_ _、#/##、void/void*、weak)

    嵌入式C开发关键字的应用技巧 1 volatile volatile修饰表示变量是易变的 xff0c 编译器中的优化器在用到这个变量时必须每次都小心地从内存中重新读取这个变量的值 xff0c 而不是使用保存在寄存器里的备份 xff0c 有效
  • 对‘cv Mat Mat()’未定义的引用‘cv imread(cv String const&, int)’未定义的引用 ...的解决办法

    对 cv Mat Mat 未定义的引用 cv imread cv String const amp int 未定义的引用 的解决办法 视觉SLAM十四讲的ch5的部分代码 xff0c 运行时出现了大面积的报错 xff0c 说相应的函数没有定
  • const pointer

    int a b const int p 61 a 与int const p 61 a 是一样的 表示p可以指向a xff0c 也可以改变指向b xff0c 但是不能通过指针p来修改a的值 p 61 b p 61 4 int const q
  • const与define的区别

    1 define是预编译指令 xff0c const是普通变量的定义 xff0c define定义的宏是在预处理阶段展开的 xff0c 而const定义的只读变量是在编译运行阶段使用的 2 const定义的是变量 xff0c 而define
  • 关于C++中的#define

    include lt iostream gt using namespace std define ADD x y x 43 y 试卷上是减号 xff0c 本人觉得是加号 int main int m 61 3 int n 61 4 m 4
  • require js之define 函数

    require js define 函数 模块不同于传统的脚本文件 它良好地定义了一个作用域来避免全局名称空间污染 它可以显式地列出其依赖关系 并以函数 定义此模块的那个函数 参数的形式将这些依赖进行注入 而无需引用全局变量 Require
  • 指针与const限定符

    const限定符和指针结合起来常见的情况有以下几种 const int a int const a 这两种写法是一样的 a是一个指向const int的指针 a所指向的内存单元不可改写 所以 a 是不允许的 但a可以改写 所以a 是允许的
  • Effective C++——尽可能使用const

    const允许指定一个语义约束 也就是指定一个 不该被改动 的对象 而编译器会强制实施这项约束 只要保持某个值不变是事实 就应该说出来 以获得编译器的协助 保证不被违反 const与指针 注意const的写法 const char p p可

随机推荐

  • ROS学习总结十七:自定义消息的使用

    在初学ROS时 xff0c 一般都是使用的ROS标准库 xff0c 包括激光电云laserscan 位姿posestamp等 这些库基本满足了我们的日常使用 xff0c 但是在开发时 xff0c 难免会遇到一些情况使用标准库不太合适 xff
  • [stm32]UART串口利用空闲中断接收一帧不定长数据

    查阅网上的方法有很多 xff0c 这里记录一下自己用的一种方式 xff0c 默认开启UART串口中断 xff0c cubemx生成工程代码 1 定义发送和接收全局数组 xff0c 用于缓存数据 RX frame size xff1a 接收到
  • JavaScript入门笔记(一)

    目录 一 JavaScript xff08 一 xff09 特点 xff08 二 xff09 作用 xff08 三 xff09 网页中插入JavaScript脚本的方法 1 行内式 2 嵌入式 3 链接式 一 JavaScript xff0
  • 面向对象学习笔记(一)——C++构造函数后加冒号

    目录 一 初始化常量数据成员和引用数据成员 二 调用拥有一组参数的基类的构造函数 构造函数后加冒号是初始化表达式 xff0c 有四种情况下应该使用初始化表达式来初始化成员 xff1a 1 xff1a 初始化const成员 xff1b 2 x
  • XML入门笔记(二)——关于ASP网站中文乱码问题

    目录 问题的发现 问题原因 原因 常用编码 解决方法 1 UTF 8编码打开 xff0c 插入如下代码 xff1a 2 GB2312编码打开 xff0c 插入如下代码 xff1a 问题的发现 在编写 ASP 代码 xff0c 利用服务器端完
  • 和×××的历史qq

    2002 12 04 17 45 42 去看小娜没有啊 没事给我来个电话 2002 12 05 22 40 46 单身浪人 老子在上海呢 通过服务器中转 2003 05 30 05 05 43 xff09 2003 05 30 06 36
  • hexo注意事项和常用命令

    hexo注意事项和常用命令 我的博客网站 xff1a Gitee xff1a 一丈青 gitee io GitHub xff1a 一丈青 1zhangqing github io 自己手写front matter就是写 然后回车就能出现写f
  • cmake-debug和release模式

    一般在工程中 xff0c 自动构建可能会编译两个版本的发布包 xff0c 一个debug版本 xff0c 一个release版本 那么通过cmake怎样来实现呢 xff1f 本文就以这个需求为例 xff0c 来介绍cmake中的逻辑控制 目
  • CSDN,你在忽悠谁?——社区用户数量大曝光

    根据 http hi csdn net 提供的好友搜索功能 xff0c 按地区搜索结果得出 xff0c csdn 社区用户数量是国内 66964 xff0c 国外用户总数不超过 1 千 详细清单请点击 根据 csdn 官方提供的数据 htt
  • vb.net中使用GetPrivateProfileString访问INI文件,解决中文路径问题

    在vb net2005 43 winxp中 xff0c 我使用GetPrivateProfileString读取一个ini文件 xff0c 如果文件路径中含有中文 xff0c 就会遇到一个奇怪的问题 xff1a 第一次读取正常 xff0c
  • CSDN史上最大的非法集资案

    短短 12 小时内发生了什么 xff1f 263231 分 xff0c 417 人次 xff0c 押宝游戏 疯狂大倒分 成为了 CSDN 历史上最大的非法集资 非法集资怎么操作的 xff1f 谁是幕后黑手 xff1f 集资的目的是什么 xf
  • 小帅和七个男友 ---第二章 一株含羞草

    第二章 一株含羞草 升入初三 xff0c 中考对我们这所国家重点中学来说 xff0c 只相当于一场普通的模拟考试 学习并不紧张 xff0c 我们还是该玩的玩 xff0c 该吃的吃 转瞬间就远去的椅子 xff0c 激起了我少女的情怀 我越来越
  • 20号你会黑屏吗?来验证一下你的正版XP和Office

    相当一部分企业都担心自己的电脑到时候会黑屏 这些企业并不是拿不出那几千块买套正版 xff0c 是没有习惯 其他社区也就罢了 xff0c 作为csdn xff0c 以软件开发人员集中的社区 xff0c 对使用正版软件这么抵触 xff0c 是不
  • 搜狗输入法 VS 拼音加加

    用了16年计算机 xff0c 一共用过四个输入法 xff1a 五笔 xff08 牌子忘记了 xff09 xff0c 智能ABC xff0c 拼音加加 xff0c 搜狗 放弃五笔的原因很简单 xff1a 我要学拼音 xff01 一说到高考 x
  • 苹果应用商店支持人民币信用卡(已验证,有图有真相)

    今日打开i4上的app store xff0c 惊奇发现货币单位已从 变为 xffe5 惊讶万分 xff0c 于是测试一下 xff0c 随机找了一个25元的航班追踪应用 屏幕弹出登录界面后 xff0c 输入appleid xff0c 随后出
  • 2011年终总结-DIY 苹果手机铃声

    一首 月亮之上 红遍中国南北 xff0c 只要这铃声响起 xff0c 100个人得有10个人掏出手机看看 xff0c 当之无愧的山寨歌王 当IPhone变成街机 xff0c 出厂铃声数量不多 xff0c 铃声总是撞车 xff0c DIY个性
  • CELF(Cost-Effective Lazy Forward selection)具有成本效益的惰性前向选择算法

    CELF Cost Effective Lazy Forward selection 算法解析 引言 xff1a 在社交网络影响力最大化问题的求解过程中 xff0c 我们往往需要去选择一些目标种子结点作为信息初始传播的源头 贪婪算法在传播效
  • 如何正确的报修

    先讲个故事 xff0c 今天接到一宗报修 xff0c 主题是 数据库连不上了 xff0c 我的天 xff0c 大事件啊 xff0c 习惯性地立即测试一下 xff0c 发现一切正常 随后开始追问谁说的 数据库连接不上 xff0c 原来是一个女
  • HTML5移动应用抓包

    有时候看到某个移动应用很不错 xff0c 想研究一下其HTML5源码 xff0c 样式表 xff0c 脚本什么的 xff0c 正常方法是不好得到的 通常可以用Safari伪造User Agent来欺骗目标网站 xff0c 让网站认为你是一个
  • #define和const的区别

    这个区别用从几个角度来说 xff1a 角度1 xff1a 就定义常量说的话 xff1a const 定义的常数是变量 也带类型 xff0c define 定义的只是个常数 不带类型 角度2 xff1a 就起作用的阶段而言 xff1a def