c++中typedef、define、const、inline之间的区别
1.typedef和#define的区别
typedef int* pInt;
int a = , b = ;
const pInt p1 = &a; //p1是常量指针
pInt const p2 = &b; //p2是常量指针
//这里的const就是拿来修饰p1、p2的,跟pInt没关系
1)作用:typedef定义了一个新的类型别名,而#define(宏定义)只是简单的替换
2)类型安全检查:用typedef定义时有类型安全检查,而#define是简单的替换,没有类型安全检查(所以容易出错)
3)处理阶段:typedef在编译阶段处理,而#define是预处理指令,在预编译阶段处理
4)作用域:typedef在它定义域内有效,而#define一旦定义将不受定义域限制(即使在局部定义也在全局范围内有效)
5)能否被取消:typedef定义后不能被取消,而#define可以用定义后可以用#undef取消
void f1()
{
#define N 15
const int n =;
cout << N << endl;
} void f2()
{
cout << N << endl; //正确,N已经定义过,不受定义域限制
#undef N
cout << N << endl; //错误,N的定义被取消
cout << n << endl; //错误,n定义域只在f1函数中
}
6)与指针有关的操作:
#define pD int*
typedef int* pT;
int a = , b = ;
const pT p1 = &a; //p1是常量指针
pT const p2 = &b; //p2是常量指针
//pT是一种类型,这里的const是拿来修饰p1、p2的,跟pT没关系 const pD p3 = &a; //p3是指向常量的指针
pD const p4 = &b; //p4是常量指针
//pD是简单的替换 pD p5, p6; //p5是指针,p6是int变量
pT p7, p8; //p7和p8都是指针
2.#define和const的区别
1)两者都可以用来定义只读数据
2)处理阶段:#define是预处理指令,在预编译阶段处理,而const在编译阶段处理
3)类型安全检查:#define是简单的替换,没有类型安全检查,而const常量有具体的类型,有类型安全检查,所以c++鼓励使用const来替代#define(effective c++条款2:尽量以const, enum, inline替换#define)
4)能否被取消:#define定义后可以用#undef取消,const定义后不能被取消
5)赋值时的空间分配:多次使用这两个关键字定义的常量给其他变量赋值时,const定义的常量在程序运行过程中只有一份拷贝,而#define定义的常量在内存中有多份拷贝
#define PI 3.141 //宏
const int P = 3.14; //此时并不给P分配内存,而是将P放入符号表
double i = P; //此时才为Pi分配内存,以后不再分配
double I = PI; //进行宏替换后,分配内存
double j = P; //没有内存分配
double J = PI; //进行宏替换后,又一次分配内存
3.#define和inline的区别
1)作用:#define是关键字,是简单的替换,而inline是函数,inline(内联)函数对编译器提出建议,是否进行宏替换,编译器有权拒绝
2)处理阶段:#define是预处理指令,在预编译阶段处理,而inline在编译阶段处理
3)类型安全检查:#define没有类型安全检查,而inline有类型安全检查
c++中typedef、define、const、inline之间的区别的更多相关文章
- 面试问题5:const 与 define 宏定义之间的区别
问题描述:const 与 define 宏定义之间的区别 (1) 编译器处理方式不同 define宏是在预处理阶段展开: const常量是编译运行阶段使用: (2) 类型和安全检查不同 ...
- Spring中Model,ModelMap以及ModelAndView之间的区别
原文链接:http://blog.csdn.net/zhangxing52077/article/details/75193948 Spring中Model,ModelMap以及ModelAndVie ...
- #define\const\inline的区别与联系
总结: const用于代替#define一个固定的值,inline用于代替#define一个函数.是#define的升级版,为了消除#define的缺陷. 参考内容:http://www.cnblog ...
- java中关于&、&&、|、||之间的区别和运算
关于&.&&.|.||之间的区别和运算 在逻辑运算中: 普通与&:要判断所有的判断的条件 短路与&&:如果前面一个判断条件出现false,则后续的判断条 ...
- GPU CUDA编程中threadIdx, blockIdx, blockDim, gridDim之间的区别与联系
前期写代码的时候都会困惑这个实际的threadIdx(tid,实际的线程id)到底是多少,自己写出来的对不对,今天经过自己一些小例子的推敲,以及找到官网的相关介绍,总算自己弄清楚了. 在启动kerne ...
- struts2中拦截器与过滤器之间的区别
首先是一张经典的struts2原理图 当接收到一个httprequest , a) 当外部的httpservletrequest到来时 b) 初始到了servlet容器 传递给一个标准的过滤器链 c) ...
- ES6中let、const和var的区别
一.let 1.基本用法 ES6 新增了let命令,用来声明变量. let 的用法类似于 var,但所声明的变量只在 let 命令所在的代码块内有效(一个“{}”相当于一个代码块) { let a = ...
- C++中头文件、源文件之间的区别与联系
.h头文件和.cpp文件的区别 疑惑1:.h文件能够编写main函数吗? 实验: 编写test.h文件,里面包含main函数 若直接编译g++ test.h -o test,通过file命令 file ...
- Servlet中的GET和POST之间的区别
自己的感悟: get和post这是http协议的两种方法,另外还有head, delete等 这两种方法有本质的区别,get只有一个流,参数附加在url后,大小个数有严格限制且只能是字符串.post的 ...
随机推荐
- 问题2:input、textarea、submit 宽度设置为100%,但显示宽度不一致
<style type="text/css"> body{ padding: 10px; } input,textarea{ width: 100%; } </s ...
- 截图原理(一)——Android自动化测试学习历程
把两节的内容汇总起来,第一节讲的是如何在apk中直接进行截屏,用到了Robotium的Solo类的takeScreenShot方法,有一个小的demo,以及从方法一直往里钻,知道它具体是怎么进行截屏的 ...
- 项目总结06:Java Excel文件导入功能HSSFWorkbook(xls)和 XSSFWorkbook (xlsx)
项目中碰到Excel文件打入数据功能Mark一下 package com.blue.pem.client.util; import java.io.File; import java.io.FileI ...
- 用django实现一个资产管理的系统
整个页面的效果如下图所示 1.登陆注册页面 2.注册的页面 3.登陆页面 4.所有设备 5.正常设备页面 6.退库设备页面 7.丢失设备页面 8.导出设备的页面,仅仅在所有设备页面才支持导出按钮 9. ...
- Java反射获取对象VO的属性值(通过Getter方法)
有时候,需要动态获取对象的属性值. 比如,给你一个List,要你遍历这个List的对象的属性,而这个List里的对象并不固定.比如,这次User,下次可能是Company. e.g. 这次我需要做一个 ...
- jquery关于attr和prop的差异
转自:http://www.jb51.net/article/88068.htm 处理像checkbox,radio和select这样的元素时,经常会发现明明使用了attr设置了selected或ch ...
- linux下的压缩命令
linux zip命令 zip -r myfile.zip ./* 将当前目录下的所有文件和文件夹全部压缩成myfile.zip文件,-r表示递归压缩子目录下所有文件. 2.unzip unzip - ...
- PAT 1080 MOOC期终成绩(25)(STL-map及multiset+思路+测试点分析)
1080 MOOC期终成绩(25 分) 对于在中国大学MOOC(http://www.icourse163.org/ )学习"数据结构"课程的学生,想要获得一张合格证书,必须首先获 ...
- 一个非常有意思的蜜罐T-Pot 16.10
In March 2016 we released T-Pot 16.03 and the positive feedback encouraged us to continue developmen ...
- 爬取掌阅app免费电子书数据
主要介绍如何抓取app数据及抓包工具的使用,能看到这相信你已经有爬虫基础了 编不下去了,主要是我懒,直接开干吧! 一.使用环境和工具 windows + python3 + Jsonpath + Ch ...