避免使用宏#define定义常量
避免使用宏#define定义常量
- 1 前言
- 2 使用const而不是#define定义常量
- 3 总结
1 前言
C/C++预处理器提供了一系列的编译指令,通常,C++惯例是使用这些编译指令来惯例编译过程。
例如,
#include
编译指令是管理程序文件的重要组件- 其他编译指令(
#ifndef
和#endif
)使得能够控制是否对特定的代码块进行编译 #pragma
编译指令使得能够控制编译器特定的编译选项
这些都是非常有帮助的工具,但使用#define
编译指令时要谨慎。
2 使用const而不是#define定义常量
符号常量可以提高代码的可读性和可维护性,常量名指出了其含义,如果要修改它的值,只需定义修改一次,然后重新编译即可。C使用预处理器来创建常量的符号名称。
#define MAX_LENGTH 100
这样,预处理器将在编译之前对源代码执行文本置换,即用100代替所有的MAX_LENGTH
。
而C++则在变量声明使用限定符const
:
const int MAX_LENGTH = 100;
这样MAX_LENGTH
将被视为一个只读的int
变量。
使用const
的方法有很多优越性。
首先,声明显式指明了类型。 使用#define
时必须在数字后加上各种后缀来指出除char
,int
或double
之外的类型。比如,使用100L来表明long
类型。
其次,const
方法更方便用于复合类型,比如:
const int base_vals[5] = {1000, 2000, 3500, 6000, 10000};
最后,const
标识符遵循变量的作用域规则 ,因此可以创建作用域为全局、名称空间或数据块的常量。在特定函数中定义常量时,不必担心其定义会与程序的其他地方使用的全局常量冲突。比如:
#define n 5
const int dz = 5;void fizzle()
{int n;int dz;
}
预处理器把int n;
替换为int 5;
从而导致编译错误,而fizzle()
中定义的dz
是局部变量,该变量和const
常量不是一回事。
3 总结
使用const
而不是#define
定义常量
#define
预处理宏是全局的,因为它会在编译器编译代码之前被简单地替换成代码,不符合C++
强调命名空间、类这样的概念的宗旨。
-#define
预处理宏不能正确地指定类型,const
修饰的常量必须指定类型。C
必须用宏定义常数但C++
不一定。在以下代码中,如果是C
,就会提示定义数组时需要一个常量作下标,表明const
只是不可修改的变量,因此C
里只能用#define
定义常量,但C++
却可以用const
。
const int n = 256;
char a[n] = {0};
- 用
#define
定义常量会浪费更多空间。如果这个宏多次被使用,则会比const
耗费更多不需要耗费的空间。 - 如果是一组相关的整形常量,最好使用
enum
,如下
enum
{LEVEL1 = 1;LEVEL2 = 2;LEVEL3 = 4;LEVEL4 = 8;
}
避免使用宏#define定义常量相关推荐
- #define 定义常量和宏,指针和结构体
目录 #define 定义常量和宏 #define 定义常量 #define 定义宏 指针 内存 指针变量的大小 结构体 #define 定义常量和宏 #define 定义常量 在变量和常量2,#de ...
- [C语言]static关键字--#define 定义常量和宏--初识指针--初识C语言(四)
文章目录 前言 一,static关键字 二,#define 定义常量和宏 三,初识指针 总结 前言 本节主要记录初识C语言第四节内容. 内容包括:static关键字------#define 定义常量 ...
- C语言——初识C语言(define定义常量和宏,指针,结构体)
1.1define定义常量和宏 define 定义符号(定义常量) //define 定义标识符常量 #define MAX 1000 define 定义宏(宏是有参数的,参数用来替换) ...
- define定义常量和宏 以及 寄存器关键字register
在C语言中,# 指的是预处理指令.像#define就是在main函数之前预先进行定义. define定义常量 这里定义了常量NUM,我们知道数组固定下标值必须是常量,这也进一步说明了这里define定 ...
- C语言中的#define定义常量和宏
C语言中的define是一个预处理指令. 1.define定义常量 格式为:#define 标识符 常量 , 注意:语句末尾没有":". 2.define定义宏 ...
- C++ 笔记(07)— 常量(字面常量、const定义常量、constexpr 定义常量、enum 定义常量、define 定义常量)
在 C++ 中,常量类似于变量,只是不能修改.与变量一样,常量也占用内存空间,并使用名称标识为其预留的空间的地址,但不能覆盖该空间的内容. 常量可以是任何的基本数据类型,可分为整型数字.浮点数字.字符 ...
- UIKIT_EXTERN和define定义常量
看过我其他的博客的人都知道,我喜欢用define定义常量,最近看了一个开源的轮子,使用UIKIT_EXTERN这个定义的常量,了解了一下,发现使用宏定义的常量会在内存中临时开辟一份内存空间,而使用UI ...
- C语言 define 定义常量 - C语言零基础入门教程
目录 一.define 简介 二.define 实战 1.不使用 define 2.使用 define 3.使用 define 优点 三.猜你喜欢 零基础 C/C++ 学习路线推荐 : C/C++ 学 ...
- iOS 宏(define)与常量(const)的正确使用
2019独角兽企业重金招聘Python工程师标准>>> 在iOS开发中,经常用到宏定义,或用const修饰一些数据类型,经常有开发者不知怎么正确使用,导致项目中乱用宏与const修饰 ...
- 为什么不要工程中不要随意使用define定义常量
首先,预处理命令他不是一个常量!!!! 我们来看一段代码 #define avatar @"60"if (false) {#define avatar @"80" ...
最新文章
- docker from指令的含义_Docker中Dockerfile多From 指令存在的意义
- MySQL使用时遇到的问题
- BZOJ3611: [Heoi2014]大工程
- 1.Python数据类型、方法
- 【Vue】详解 SFC 与 vue-loader
- 【Data guard】SWITCHOVER_STATUS为FAILED DESTINATION解决办法
- Android OpenGL ES(十二):三维坐标系及坐标变换初步 .
- 数据仓库与数据挖掘 阶段考试复习题
- JavaStudyNotes
- 如何用计算机测量图片景深,用手机也能测景深 DOF Master景深测量软件
- 典型行业大数据应用和安全风险和解决方案
- 青岛科技大学计算机历年真题,青岛科技大学计算机组成原理补考试卷(计算机)...
- 如何在PPT中嵌入交互式图表?LightningChart助力炫酷展示
- 关于海思3559A板子(润和出厂)启动的阶段性总结
- MATLAB 求解定积分和不定积分
- 周鸿祎回应EOS漏洞:不是最后一个,也不是最厉害的一个,EOS主网应延迟上线!...
- sequence_loss_by_example()函数在Tensorflow2.x找不到
- 2021-2025年中国健身训练软件行业市场供需与战略研究报告
- Win 10 Hyper-V 虚拟机怎么迁移部署
- 为什么说手机短信网址要慎点?该如何辨别
热门文章
- 计算机清理垃圾代码,你也可以写代码系列,一键清除系统垃圾文件的代码(超简单)-清除垃圾文件...
- JDBC学习笔记(动力节点+附代码分析)
- VLAN配置实验和TRUNK配置实验
- 网站部署证书 百度浏览器仍提示不安全网站怎么办
- vs2012窗体嵌入表格_2012年电子表格日
- CTF.show:misc入门24-49
- 『IT视界』 [原创评论]揪出"程序员"身上的"六宗罪"
- 【ROS基础】.launch文件语法记录
- 如何通过AdsPower保障Facebook账号登录稳定
- EXCEL中的MID函数查询身份证年龄