原文: http://blog.csdn.net/t894690230/article/details/50605021

前言:突然想起很久之前上课时被问及C++ 宏定义与常量的区别,仔细了想了想,并没有答起(尴尬),这次就简单总结一下C++宏常量与常量的区别吧。

1. 宏定义

宏定义是C语言提供的三种预处理中的一种,又称为宏代换、宏替换,简称“宏”,用#define定义,如下:

#define Pi 3.1415926
  • 1
  • 1

宏常量没有类型,它是在编译前即预编译阶段进行字符替换,就好比如下的例子:

S = PI * r * r
  • 1
  • 1

在预编译阶段,直接将PI替换成3.1415926,同时没有类型安全检查,系统也不会为它分配内存。

宏定义使用#undef符号终止宏定义的作用域。

2. 常量

常量则是一种标识符,它的值在运行期间恒定不变。常量使用关键字const定义,如下:

const float PI = 3.14159;
  • 1
  • 1

常量是在运行时进行替换,并且在编译时会进行严格的类型检验,同时系统也会为常量分配内存。

3. 区别

如上所述,C++语言可以用const 来定义常量,也可以用#define来定义宏常量。但是两者的区别在于:

  • const 常量有数据类型,而宏常量没有数据类型;
  • const 常量在运行时进行替换,宏常量则是在预编译截断进行替换,const 常量在编译阶段会进行类型安全检查,宏常量则不会;
  • 有些集成化的调试工具可以对const 常量进行调试,但是不能对宏常量进行调试。

4. 附录

在实际使用中,由于宏常量在预编译时只是进行简单的字符替换,而不会进行编译检查,所有应该特别注意宏常量的使用,譬如如下代码:

#define N 3 + 2

float a = 2 * N
  • 1
  • 2
  • 3
  • 1
  • 2
  • 3

预想的值应该是a=10,但实际结果却是a=8,这是因为宏常量N在预编译阶段直接将字符替换,变成了如下代码:

float a = 2 * 3 + 2
  • 1
  • 1

这也叫宏定义的“边缘效应”。

另外根据规则5-2-1:在C++ 程序中只使用const 常量而不使用宏常量,即const 常量完全取代宏常量。

最新文章

  1. [Math] Backpropagation
  2. Linux入门50指令
  3. Bugtags 实时跟踪插件 - BugtagsInsta
  4. Ajax 简述
  5. highcharts图表中级入门之xAxis label:X(横)坐标刻度值过长截断多行(换行)显示问题说明
  6. 操作数据库系统(OLTP)和联机分析处理系统(OLAP)的区别
  7. thinkphp的自动完成功能说明
  8. 反射-优化及程序集等(用委托的方式调用需要反射调用的方法(或者属性、字段),而不去使用Invoke方法)
  9. http://blog.csdn.net/xiamizy/article/details/40781939
  10. 动态规划之最长公共子序列LCS(Longest Common Subsequence)
  11. svn unable to connect to a repository at url 执行上下文错误 不能访问SVN服务器问题
  12. #include <cstdarg>
  13. arm: 使用结构体操作寄存器
  14. [CSS3] 学习笔记--CSS盒子模型
  15. 洛谷P4104 [HEOI2014]平衡(dp 组合数学)
  16. SAP从入门到精通 知识体系
  17. [UE4]Background Blur,背景模糊
  18. app测试环境搭建(python)
  19. 算法笔记--lca倍增算法
  20. ACM大牛的BLOG(转)

热门文章

  1. 使用dmidecode在Linux下获取硬件信息
  2. Springboot(二)-application.yml默认的配置项以及读取自定义配置
  3. rom bist scripts
  4. Django ORM (一) 创建数据库和模型常用的字段类型参数及Field 重要参数介绍
  5. JavaScript正则表达式-反向引用
  6. django的rest framework框架——认证、权限、节流控制
  7. HDU 4089 && UVa 1498 Activation 带环的概率DP
  8. linux相关技术
  9. vue.js 利用SocketCluster实现动态添加数据及排序
  10. Dell Omsa在Linux服务器上安装部署