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常量是编译运行阶段使用. ( ...
 
随机推荐
- raywenderlich.com Objective-C编码规范
			
原文链接 : The official raywenderlich.com Objective-C style guide 原文作者 : raywenderlich.com Team 译文出自 : r ...
 - LeetCode(111) Minimum Depth of Binary Tree
			
题目 Given a binary tree, find its minimum depth. The minimum depth is the number of nodes along the s ...
 - LeetCode(40) Combination Sum II
			
题目 Given a collection of candidate numbers (C) and a target number (T), find all unique combinations ...
 - POJ-3106 Flip and Turn (模拟)
			
[题目大意] 给你一个n*m的矩阵,然后给你一系列操作,最后让你输出操作后的矩阵. 操作包括: 1:沿主对角线反转 2:沿副对角线反转 H:上下翻转 V:水平翻转 A B C:顺时针90° 180° ...
 - MySQL MGR集群搭建
			
本文来自网易云社区,转载务必请注明出处. 本文将从零开始搭建一个MySQL Group Replication集群,包含3个节点.简单介绍如何查询MGR集群状态信息.并介绍如何进行MGR节点上下线操作 ...
 - PHP cannoy modify header information - headers already sent by ....
			
我采用的是MVC模式的写法,代码和html分离的写法 <?php require '../mysql_connect.php'; require('../model/functions.php' ...
 - 【LeetCode】Reverse Nodes in k-Group(k个一组翻转链表)
			
这是LeetCode里的第25道题. 题目要求: 给出一个链表,每 k 个节点一组进行翻转,并返回翻转后的链表. k 是一个正整数,它的值小于或等于链表的长度.如果节点总数不是 k 的整数倍,那么将最 ...
 - Codeforces Round #401 (Div. 2)  离翻身就差2分钟
			
Codeforces Round #401 (Div. 2) 很happy,现场榜很happy,完全将昨晚的不悦忘了.终判我校一片惨白,小董同学怒怼D\E,离AK就差一个C了,于是我AC了C题还剩35 ...
 - PAT天梯赛练习题——L3-003. 社交集群(并查集按秩合并)
			
L3-003. 社交集群 时间限制 1000 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 在社交网络平台注册时,用户通常会输入自己的兴趣爱好, ...
 - BSGS算法 (小步大步 Baby Step Gaint Step)
			
当你要求满足: $$ A^x \equiv B \ (\bmod \ P) $$ 的最小非负整数 x (gcd(A,P)==1)就可以用到 BSGS 了 设 $ m=\sqrt{P} $ 向上取整 处 ...