C++笔记020:const 和 #define 的对比
原创笔记,转载请注明出处!
点击【关注】,关注也是一种美德~
第一,const与#define的相同点
C++中的const常量类似于宏定义
const int c = 5 ≈ #define c 5
const是用来替换#define的一个手段。
程序一:
int main()
{
const int a=10;
printf("a=%d\n",a);
return 0;
}
程序二:
#define a 10
int main()
{
//const int a=10;
printf("a=%d\n",a);
return 0;
}
这两个程序运行结果都是一样的,都是定义一个常量a,注意#define最后是没有分号的。下面这两个程序也说明了这一点:
#define a 10
#define b 10
int main()
{
int arr[a+b];
system("pause");
return 0;
}
编译成功!
#define a 10
#define b 10
int main()
{
int arr[a+b];
return 0;
}
编译成功!
第二,const与#define的不同点
看程序:

现在a是一个宏定义,我们知道宏定义,凡是变量a所在的地方预处理编译器都进行替换,也就是将a替换为10。因此在函数fun1中定义的a在函数fun2中是可以使用的,也就是说宏定义是没有作用域检查的。运行可以通过。
那么如果想将a的作用域限制在函数fun1中,可以使用“卸载宏”或者称作“取消宏” #undef 来达到目的。
#undef a —— 此处往下取消a的宏定义;
#undef —— 此处往下取消所有宏定义。
在看看const作用域检查,我们在fun1中定义变量b,其作用域就局限在fun1函数中了,在fun2函数中是不可用的,可以取消 //printf("b=%d\n",b); 的注释,发现编译时错误的!
结论:
C++中的const常量与宏定义不同
const常量是由编译器处理的,提供类型检查和作用域检查;
宏定义由预处理器处理,单纯的文本替换。
原创笔记,转载请注明出处!
更多精彩请关注微信公众号:依法编程

C++笔记020:const 和 #define 的对比的更多相关文章
- const 和 #define区别_fenglovel_新浪博客
const 和 #define区别 (2012-12-11 14:14:07) 转载▼ 标签: 杂谈 (1) 编译器处理方式不同 define宏是在预处理阶段展开. const常量是编译运行阶段使 ...
- php中const和define的区别
define部分:宏不仅可以用来代替常数值,还可以用来代替表达式,甚至是代码段.(宏的功能很强大,但也容易出错,所以其利弊大小颇有争议.)宏的语法为:#define 宏名称 宏值作为一种建议和一种广大 ...
- 在php中定义常量时,const与define的区别?
问]在php中定义常量时,const与define的区别? [答]使用const使得代码简单易读,const本身就是一个语言结构,而define是一个函数.另外const在编译时要比define快很 ...
- 面试问题5:const 与 define 宏定义之间的区别
问题描述:const 与 define 宏定义之间的区别 (1) 编译器处理方式不同 define宏是在预处理阶段展开: const常量是编译运行阶段使用: (2) 类型和安全检查不同 ...
- 关于const和define的内存分配问题的总结
关于const和define的内存分配问题 const与#define宏定义的区别----C语言深度剖析 1, const定义的只读变量在程序运行过程中只有一份拷贝(因为它是全局的只读变量,存放在静 ...
- iOS—— static和const联合使用;使用static const 与 #define
static和const联合使用: static将一个全局变量变成局部变量 const将一个局部变量变成局部常量 // 定义了一个局部常量 static const CGFloat ...
- 实例讲述PHP面向对象的特性;;;php中const与define的使用区别
php中const与define的使用区别 1.const:类成员变量定义,一旦定义且不能改变其值. define:定义全局常量,在任何地方都可以访问.2.define:不能在类中定义,而const可 ...
- const和#define常量的区别
(1) 编译器处理方式不同 define宏是在预处理阶段展开. const常量是编译运行阶段使用. (2) 类型和安全检查不同 define宏没有类型,不做任何类型检查,仅仅是展开. const常量有 ...
- 【编程基础】const与#define的区别
[前言] 相信大家看别人代码的时候都遇到过,有人用#define定义,也有人用const定义. 那么两者的区别到底是什么呢?哪个更好用呢? 网上查了又查,下面总结一下. [总结] 编译器处理方式不同 ...
随机推荐
- 空间分析开源库GEOS
History of GEOS GEOS中Geometry的结构 GEOS分析功能简介 1.History of GEOS JTS Topology Suite是Ma ...
- Oracle客户端安装以及PL/SQL Developer安装方法
1,安装Oracle客户端 2,配置数据库,如下: 安装路径:D:\app\ThinkPad\product\11.2.0\client_1\network\admin 建立文件:tnsnames.o ...
- python迭代器 生成器 三元运算 列表解析
1.迭代器 迭代器是访问集合元素的一种方式.迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束.迭代器只能往前不会后退,不过这也没什么,因为人们很少在迭代途中往后退.另外,迭代器的一大优 ...
- Integer 和 int 值比较
int 是基本数据类型,会进池,可以使用 == 判断两个值相等 Integer是对象,比较对象不能使用 == , 可以使用Integer.intValue()将取出对象值比较
- Windows 10 host where Credential Guard or Device Guard is enabled fails when running Workstation (2146361)
To disable Device Guard or Credential Guard on Itanium based computers: Disable the group policy set ...
- 电话面试问答Top 50 --[伯乐在线]
今年是2015年,在过去几年中,电面(电话面试)是筛选程序员职位候选人的最流行的方式.它让雇佣双方很容易互相了解对方,候选人不需要去未来雇主的所在地,面试官也不用做额外的安排.这是我介绍程序员面试问题 ...
- Json转Map
http = new HttpClient**();//此处封装一下发请求的类 Map<String, String> map = new HashMap<String, Strin ...
- [翻译] GTAppMenuController
GTAppMenuController https://github.com/gianlucatursi/GTAppMenuController This is a simple project in ...
- [翻译] ABPadLockScreen
ABPadLockScreen ABPadLockScreen aims to provide a universal solution to providing a secure keypad/pi ...
- django1.8 增加注册用户其他字段(用户扩展)
在V1.6及之后版本已经删除get_profile()方法,需要使用userprofile. 1.新建moduel,名为UserProfile: class UserProfile(models.Mo ...