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之间的区别的更多相关文章

  1. 面试问题5:const 与 define 宏定义之间的区别

    问题描述:const 与 define 宏定义之间的区别 (1) 编译器处理方式不同     define宏是在预处理阶段展开:     const常量是编译运行阶段使用: (2) 类型和安全检查不同 ...

  2. Spring中Model,ModelMap以及ModelAndView之间的区别

    原文链接:http://blog.csdn.net/zhangxing52077/article/details/75193948 Spring中Model,ModelMap以及ModelAndVie ...

  3. #define\const\inline的区别与联系

    总结: const用于代替#define一个固定的值,inline用于代替#define一个函数.是#define的升级版,为了消除#define的缺陷. 参考内容:http://www.cnblog ...

  4. java中关于&、&&、|、||之间的区别和运算

    关于&.&&.|.||之间的区别和运算 在逻辑运算中: 普通与&:要判断所有的判断的条件 短路与&&:如果前面一个判断条件出现false,则后续的判断条 ...

  5. GPU CUDA编程中threadIdx, blockIdx, blockDim, gridDim之间的区别与联系

    前期写代码的时候都会困惑这个实际的threadIdx(tid,实际的线程id)到底是多少,自己写出来的对不对,今天经过自己一些小例子的推敲,以及找到官网的相关介绍,总算自己弄清楚了. 在启动kerne ...

  6. struts2中拦截器与过滤器之间的区别

    首先是一张经典的struts2原理图 当接收到一个httprequest , a) 当外部的httpservletrequest到来时 b) 初始到了servlet容器 传递给一个标准的过滤器链 c) ...

  7. ES6中let、const和var的区别

    一.let 1.基本用法 ES6 新增了let命令,用来声明变量. let 的用法类似于 var,但所声明的变量只在 let 命令所在的代码块内有效(一个“{}”相当于一个代码块) { let a = ...

  8. C++中头文件、源文件之间的区别与联系

    .h头文件和.cpp文件的区别 疑惑1:.h文件能够编写main函数吗? 实验: 编写test.h文件,里面包含main函数 若直接编译g++ test.h -o test,通过file命令 file ...

  9. Servlet中的GET和POST之间的区别

    自己的感悟: get和post这是http协议的两种方法,另外还有head, delete等 这两种方法有本质的区别,get只有一个流,参数附加在url后,大小个数有严格限制且只能是字符串.post的 ...

随机推荐

  1. SQLServer BI 学习笔记

    MSBI 学习库: https://ask.hellobi.com/blog/biwork SSAS库部署的几种方式 http://www.cnblogs.com/aspnetx/archive/20 ...

  2. Swift 错误记录

    最近几天开始学习Swift,作为一个从 OC 转到 Swift 的程序员,我一直以为很简单.但是现在学习一个星期之后,发现问题还是蛮多的! 最大的问题就是 太特么 不习惯了!!!!!!!!!! 好吧, ...

  3. 当前的开源SLAM方案

    开源方案 传感器形式 地址链接 MonoSLAM 单目 https://github.com/hanmekim/SceneLib2  PTAM 单目  http://www.robots.ox.ac. ...

  4. python 面向对象编程 之 单例模式

    单例模式三种实现方式: 单例模式:单例模式是解决系统资源浪费的一种方案,是指一个类实例化后可以多次使用此对象. 单例模式应用场景:数据库操作.日志.后台打印 # settings.py# Host=' ...

  5. c# 使用ssh.net 上传文件

    在ssh.net 客户端实例下无法普通用户切换到su root  超级用户,原因是tty 的不支持,具体原因未查, 连接时用超级用户,问题解决 使用ssh.net  能实现远程命令,  使用其中的sf ...

  6. 如何在Fragment中获取context

    文章转载自http://blog.csdn.net/demonliuhui/article/details/51511136 这里仅供自己学习参考: Context,中文直译为“上下文”,SDK中对其 ...

  7. PAT 1085 PAT单位排行(25)(映射、集合训练)

    1085 PAT单位排行(25 分) 每次 PAT 考试结束后,考试中心都会发布一个考生单位排行榜.本题就请你实现这个功能. 输入格式: 输入第一行给出一个正整数 N(≤10​5​​),即考生人数.随 ...

  8. Porsche PIWIS III with V37.250.020 Piwis 3 Software Update New Feature

    Porsche Piwis tester 3 PT3G VCI with V37.250.020 Piwis 3 Software unlimited license installed on Ful ...

  9. [翻译]Javaslang 介绍

    原文地址:Introduction to Javaslang 1. 概述 在这篇文章中,我们将会探讨: Javaslang 是什么? 为什么需要它? 以及怎样在项目中使用它? Javaslang 是J ...

  10. QT学习之路(1):彩票绝对不中模拟器

    //============================================//绝对不中,彩票开奖模拟器#include "mainwindow.h"#includ ...