const与#define的区别、优点
2024-08-27 13:31:53
const与#define的区别
编译器处理方式不同
define宏是在预处理阶段展开。
补充:预处理器根据以#开头的命令,修改原始的程序。比如我们常见的#include <stdio.h>命令告诉处理器读取系统头文件stdio.h的内容,并把它直接插入程序文本中。咱们的#define也是,仅仅是单纯的文本替换。
const常量是编译运行阶段使用。
类型和安全检查不同
define宏没有数据类型,不做任何类型检查,仅仅是展开。
const常量有具体的数据类型,在编译阶段会执行类型检查。
存储方式不同
define宏仅仅是展开,有多少地方使用,就展开多少次,不会分配内存。
const常量会在内存中分配(可以是堆中也可以是栈中)。
const 可以节省空间,避免不必要的内存分配。
例如:
#define PI 3.14159 //常量宏
const doulbe Pi=3.14159; //此时并未将Pi放入ROM中
double i=Pi; //此时为Pi分配内存,以后不再分配!
double I=PI; //编译期间进行宏替换,分配内存
double j=Pi; //没有内存分配
double J=PI; //再进行宏替换,又一次分配内存!
const定义常量从汇编的角度来看,只是给出了对应的内存地址,而不是象#define一样给出的是立即数,所以,const定义的常量在程序运行过程中只有一份拷贝,而 #define定义的常量在内存中有若干个拷贝。
代码调试不同
const常量可以进行调试的。
define是不能进行调试的,因为在预编译阶段就已经替换掉了。
const优点
const常量有数据类型,而宏常量没有数据类型。编译器可以对前者进行类型安全检查。而对后者只进行字符替换,没有类型安全检查,并且在字符替换可能会产生意料不到的错误。
有些集成化的调试工具可以对const常量进行调试,但是不能对宏常量进行调试。
const可节省空间,避免不必要的内存分配,提高效率。
#define的优点
宏可以定义一些函数,const不可以
宏可以使代更码简洁
使用宏可以方便代码维护
宏还可以定义带参数的宏,做到一定程度的泛型(利用#或者##操作符)
最新文章
- 0025 Java学习笔记-面向对象-final修饰符、不可变类
- web前端,移动开发规范概述
- 可以编辑R代码的eclipse插件
- 实验一 Java开发环境的熟悉
- SQL逻辑读变成零
- Codeforces Round #260 (Div. 2) A B C 水 找规律(大数对小数取模) dp
- C++ 字符串相关函数
- 第一次使用unity3d
- Mysql-如何正确的使用索引以及索引的原理
- Could not autowire. No beans of &#39;xxxx&#39; type found的错误
- 安装软件出现缺少vcruntime140.dll
- python异常处理的两种写法
- Linux电源管理【转】
- border的特殊用法
- 使用fastjson解析数据后导致顺序改变问题
- Load balancing 各组件的比较
- urllib 和urllib2 模块使用简例
- VS Code配置初探
- C++ 的一个问题的理解(私有变量成员)
- (转)MapReduce Design Patterns(chapter 4 (part 1))(七)
热门文章
- jQuery---京东轮播图
- Java Day2(下)
- 已经安装了 AccessDatabaseEngine.exe,还是报错
- windows上快速新建1g的文件
- 论文阅读笔记(二)【IJCAI2016】:Video-Based Person Re-Identification by Simultaneously Learning Intra-Video and Inter-Video Distance Metrics
- Java世界最常用的工具类库
- SUSE中搭建kafka
- docker安装elasticsearch和head插件
- PHP csv文件30w+数据导入mysql数据库
- java内部类概念