避免使用宏#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,intdouble之外的类型。比如,使用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定义常量相关推荐

  1. #define 定义常量和宏,指针和结构体

    目录 #define 定义常量和宏 #define 定义常量 #define 定义宏 指针 内存 指针变量的大小 结构体 #define 定义常量和宏 #define 定义常量 在变量和常量2,#de ...

  2. [C语言]static关键字--#define 定义常量和宏--初识指针--初识C语言(四)

    文章目录 前言 一,static关键字 二,#define 定义常量和宏 三,初识指针 总结 前言 本节主要记录初识C语言第四节内容. 内容包括:static关键字------#define 定义常量 ...

  3. C语言——初识C语言(define定义常量和宏,指针,结构体)

    1.1define定义常量和宏 define    定义符号(定义常量) //define 定义标识符常量 #define MAX 1000 define    定义宏(宏是有参数的,参数用来替换) ...

  4. define定义常量和宏 以及 寄存器关键字register

    在C语言中,# 指的是预处理指令.像#define就是在main函数之前预先进行定义. define定义常量 这里定义了常量NUM,我们知道数组固定下标值必须是常量,这也进一步说明了这里define定 ...

  5. C语言中的#define定义常量和宏

    C语言中的define是一个预处理指令. 1.define定义常量        格式为:#define  标识符  常量  , 注意:语句末尾没有":". 2.define定义宏 ...

  6. C++ 笔记(07)— 常量(字面常量、const定义常量、constexpr 定义常量、enum 定义常量、define 定义常量)

    在 C++ 中,常量类似于变量,只是不能修改.与变量一样,常量也占用内存空间,并使用名称标识为其预留的空间的地址,但不能覆盖该空间的内容. 常量可以是任何的基本数据类型,可分为整型数字.浮点数字.字符 ...

  7. UIKIT_EXTERN和define定义常量

    看过我其他的博客的人都知道,我喜欢用define定义常量,最近看了一个开源的轮子,使用UIKIT_EXTERN这个定义的常量,了解了一下,发现使用宏定义的常量会在内存中临时开辟一份内存空间,而使用UI ...

  8. C语言 define 定义常量 - C语言零基础入门教程

    目录 一.define 简介 二.define 实战 1.不使用 define 2.使用 define 3.使用 define 优点 三.猜你喜欢 零基础 C/C++ 学习路线推荐 : C/C++ 学 ...

  9. iOS 宏(define)与常量(const)的正确使用

    2019独角兽企业重金招聘Python工程师标准>>> 在iOS开发中,经常用到宏定义,或用const修饰一些数据类型,经常有开发者不知怎么正确使用,导致项目中乱用宏与const修饰 ...

  10. 为什么不要工程中不要随意使用define定义常量

    首先,预处理命令他不是一个常量!!!! 我们来看一段代码 #define avatar @"60"if (false) {#define avatar @"80" ...

最新文章

  1. docker from指令的含义_Docker中Dockerfile多From 指令存在的意义
  2. MySQL使用时遇到的问题
  3. BZOJ3611: [Heoi2014]大工程
  4. 1.Python数据类型、方法
  5. 【Vue】详解 SFC 与 vue-loader
  6. 【Data guard】SWITCHOVER_STATUS为FAILED DESTINATION解决办法
  7. Android OpenGL ES(十二):三维坐标系及坐标变换初步 .
  8. 数据仓库与数据挖掘 阶段考试复习题
  9. JavaStudyNotes
  10. 如何用计算机测量图片景深,用手机也能测景深 DOF Master景深测量软件
  11. 典型行业大数据应用和安全风险和解决方案
  12. 青岛科技大学计算机历年真题,青岛科技大学计算机组成原理补考试卷(计算机)...
  13. 如何在PPT中嵌入交互式图表?LightningChart助力炫酷展示
  14. 关于海思3559A板子(润和出厂)启动的阶段性总结
  15. MATLAB 求解定积分和不定积分
  16. 周鸿祎回应EOS漏洞:不是最后一个,也不是最厉害的一个,EOS主网应延迟上线!...
  17. sequence_loss_by_example()函数在Tensorflow2.x找不到
  18. 2021-2025年中国健身训练软件行业市场供需与战略研究报告
  19. Win 10 Hyper-V 虚拟机怎么迁移部署
  20. 为什么说手机短信网址要慎点?该如何辨别

热门文章

  1. 计算机清理垃圾代码,你也可以写代码系列,一键清除系统垃圾文件的代码(超简单)-清除垃圾文件...
  2. JDBC学习笔记(动力节点+附代码分析)
  3. VLAN配置实验和TRUNK配置实验
  4. 网站部署证书 百度浏览器仍提示不安全网站怎么办
  5. vs2012窗体嵌入表格_2012年电子表格日
  6. CTF.show:misc入门24-49
  7. 『IT视界』 [原创评论]揪出"程序员"身上的"六宗罪"
  8. 【ROS基础】.launch文件语法记录
  9. 如何通过AdsPower保障Facebook账号登录稳定
  10. EXCEL中的MID函数查询身份证年龄