#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的区别 的相关文章

  • 指针常量与常量指针的区别、const 数组

    指针常量与常量指针 const 数组 一 指针常量指针本身是常量 二 常量指针指向常量的指针 三 实例四 const 数组 一 指针常量 指针本身是常量 span class token comment 指针本身不能被修改 span spa
  • 安装spconv时遇到‘remove_const_t’ is not a member of ‘std’

    主要是由于cmake的版本太高或者太低 xff0c 导致编译错误 xff0c 将版本设置为3 14 4时 xff0c 再次编译没有再发生错误
  • const成员函数

    const成员函数 const修饰的类成员函数称为const成员函数 xff0c const修饰类成员函数 xff0c 实际修饰该成员函数隐含的this指针 xff0c 表明在该成员函数中不能对类的任何成员进行修改 如下图所示 xff1a
  • C#中如何实现C++中的const reference

    C 中如何实现C 43 43 中的const reference 在读C in depth时 xff0c 作者曾经感慨过 xff0c 可惜C 中没有类似于C 43 43 的const机制 xff0c 没有办法方便的返回一个对象的只读视图 读
  • void fun() const{}; const void fun(){}; 和void const fun(){}; 的区别?

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

    span class token macro property span class token directive hash span span class token directive keyword define span span
  • #ifndef #define #endif 防止头文件被重复引用

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

    typedef和define都是替一个对象取一个别名 xff0c 以此增强程序的可读性 xff0c 区别如下 xff1a xff08 1 xff09 原理不同 define是C语言中定义的语法 xff0c 是预处理指令 xff0c 在预处理
  • dwm-1000 测距总是出现 #define SYS_STATUS_RXPTO 0x00200000UL /* Preamble detection timeout */

    ex 05b ds twr resp 程序 总是出现 致使官方的代码 无法实现通讯 define SYS STATUS RXPTO 0x00200000UL Preamble detection timeout 需要着重修改参数
  • invalid conversion from ‘const char*’ to ‘char*’解决方法

    string类的c str函数返回的是const char类型 xff0c 如果将它用作实参传递给char的形参就会报这个错误解决方法 xff1a 在调用是加 char 转换一下 xff0c 比如 char cfgfile c str
  • #define

    define用法 1 简单的define定义 define MAXTIME 1000 一个简单的MAXTIME就定义好了 xff0c 它代表1000 xff0c 如果在程序里面写 if i lt MAXTIME 编译器在处理这个代码之前会对
  • C语言中的关键字应用技巧(volatile、const、struct/union、_ _预定义_ _、#/##、void/void*、weak)

    嵌入式C开发关键字的应用技巧 1 volatile volatile修饰表示变量是易变的 xff0c 编译器中的优化器在用到这个变量时必须每次都小心地从内存中重新读取这个变量的值 xff0c 而不是使用保存在寄存器里的备份 xff0c 有效
  • #define、typedef 和 using之间的联系和区别

    目录 一 define 1 含义 2 用处 1 条件编译 2 解宏 3 文件包含 二 typedef 1 含义 2 用处 1 数据类型别名 2 指针别名 3 结构体别名 4 与平台无关的数据类型 三 using 1 含义 2 用处 1 权限
  • C语言带参#define个人理解

    之前接触带参 define比较少 xff0c 这几天 查阅stm32官方固件库 xff0c 看到以下代码有点懵 xff1a define IS GPIO ALL PERIPH PERIPH PERIPH 61 61 GPIOA PERIPH
  • const 与重载

    const到底是不是一个重载的参考对象 xff0c 请看下面的例子 class A public void f int i std cout lt lt 34 1 34 函数1 void f int i const std cout lt
  • c++ #define 用法

    1 用于表示将两个参数连在一起 xff0c 其中宏的 前后空格会被省略 define CONNA a b a b define CONNB a b a b int main string a 61 CONNA 34 one 34 34 tw
  • ubuntu(15):对‘casadi::MX::MX(casadi::MX const&)’未定义的引用

    catkin build 编译报错 xff0c 找不到CASADI的头文件目录CASADI INCLUDE DIRS或者库文件也达不到CASADI LIBRARIES xff1b 对 casadi MX horzsplit casadi M
  • const关键字与指针

    const关键字与指针 1 指针包含的地址是常量 不能被修改 但可以修改指针指向的数据 int x 10 int const p x p 34 指向的数据可以修改 int y 32 p y 不能修改P指向的地址 2 指针指向的数据是常量 不
  • 数字电路设计之verilog的define和parameter

    1 语法定义 parameter xx yy define xx yy 注 句尾无分号 2 作用范围 parameter 作用于声明的那个文件 define 从编译器读到这条指令开始到编译结束都有效 或者遇到 undef命令使之失效 后来我
  • 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