C++ 宏定义与常量
原文: 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 常量完全取代宏常量。
C++ 宏定义与常量的更多相关文章
- c语言中宏定义和常量定义的区别
他们有共同的好处就是"一改全改,避免输入错误"哪两者有不同之处吗?有的. 主要区别就在于,宏定义是在编译之前进行的,而const是在编译阶段处理的 宏定义不占用内存单元而const ...
- extern字符串常量,宏定义字符串常量,怎么选
在使用常量的时候,我看到主要有两种写法: #define RKLICURegexEnumerationOptionsErrorKey @"RKLICURegexEnumerationOpti ...
- c语言中用宏定义一个常量,数字后面带个U, L, F的含义
转: c语言中数字后面带个U是什么意思?#define F_CPU 12000000U答:U表示该常数用无符号整型方式存储,相当于unsigned int;L表示该常数用长整型方式存储,相当于long ...
- 宏定义(#define)和常量(const)的区别
最近开始准备一边做实验室的研究,一边记录一些遇到的编程中的小知识点.今天在测试对矩阵进行SVD分解时,需要定义矩阵的行和列的大小,我习惯性的用宏定义来定义了这两个变量,在运行的时候,就开始思考宏定义和 ...
- iOS常用宏定义大全
宏定义与常量的区别 宏:只是在预处理器里进行文本替换,不做任何类型检查,宏能定义代码,const不能,多个宏编译时间相对较长,影响开发效率,调试过慢,const只会编译一次,缩短编译时间. 所以在使用 ...
- C语言-宏定义与使用分析
1.C语言中的宏定义 #define是预处理器处理的单元实体之— #define定义的宏可以出现在程序的任意位置 #define定义之后的代码都可以使用这个宏 2.定义宏常量 #define定义的宏常 ...
- _编程语言_C++_宏定义#define 和 常量const 的区别
C++中有两种定义常量的方式:#define预处理和const关键字 #define 预处理指令 #include <iostream> using namespace std; #def ...
- iOS define 宏定义 和 const定义常量区别
const const 是c++中的修饰符. c++中常用来定义常量,修饰左值. #define 宏定义语句, 在预处理阶段直接做文本替换,不做类型检查. 它们之间的最大区别: 1. 对于co ...
- const常量与define宏定义的区别(转)
#define RADIUS 100; const float RADIUS = 100; (1) 编译器处理方式不同 define宏是在预处理阶段展开. const常量是编译运行阶段使用. ( ...
随机推荐
- 条款52:写了placement new 也要写placement delete(write placement delete if you write placement new)
NOTE: 1.当你写一个placement operator new .请确定也要写出了对应的placement operator delete.如果没有这样做,你的程序可能发生隐晦而时断时续的内存 ...
- 数据结构( Pyhon 语言描述 ) — — 第6章:继承和抽象类
继承 新的类通过继承可以获得已有类的所有特性和行为 继承允许两个类(子类和超类)之间共享数据和方法 可以复用已有的代码,从而消除冗余性 使得软件系统的维护和验证变得简单 子类通过修改自己的方法或者添加 ...
- python基础——14(shelve/shutil/random/logging模块/标准流)
一.标准流 1.1.标准输入流 res = sys.stdin.read(3) 可以设置读取的字节数 print(res) res = sys.stdin.readline() print(res) ...
- liunx 根目录介绍
1. /bin binary二进制 存放系统许多可执行程序文件 执行的相关指令,例如ls pwd whoami,后台的支持文件目录 2. /sbin super binary超级的二进制 存放系统许多 ...
- WordPress的编译器功能扩展
//php代码如下://向文章编辑器的Visual区添加自定义按钮,js文件存放在wp-content/plugins/文件夹下 add_action('admin_head', 'my_custom ...
- iOS学习笔记17-FMDB
上一节我已经介绍了SQLite的简单使用,不了解的可以提前去看一下iOS学习笔记16-数据库SQLite,这节我们来讲下FMDB. 一.FMDB介绍 FMDB是一种第三方的开源库,FMDB就是对SQL ...
- [UOJ#127][BZOJ4195][NOI2015]程序自动分析
[UOJ#127][BZOJ4195][NOI2015]程序自动分析 试题描述 在实现程序自动分析的过程中,常常需要判定一些约束条件是否能被同时满足. 考虑一个约束满足问题的简化版本:假设x1,x2, ...
- BZOJ 1813 [Cqoi2017]小Q的棋盘 ——树形DP
唔,貌似以前做过这样差不多的题目. 用$f(i,0/1)$表示从某一点出发,只能走子树的情况下回到根.不回到根的最多经过不同的点数. 然后就可以DP辣 #include <map> #in ...
- 刷题总结——奇怪的游戏(scoi2012)
题目: 题目描述 Blinker 最近喜欢上一个奇怪的游戏.这个游戏在一个 N*M 的棋盘上玩,每个格子有一个数.每次 Blinker 会选择两个相邻的格子,并使这两个数都加上 1.现在 Blin ...
- 【bzoj3545】[ONTAK2010]Peaks 线段树合并
[bzoj3545][ONTAK2010]Peaks 2014年8月26日3,1512 Description 在Bytemountains有N座山峰,每座山峰有他的高度h_i.有些山峰之间有双向道路 ...