C++ 宏和内联、范围for、nullptr

C++ 宏函数和内联函数、范围for、nullptr

宏函数和内联函数

​ 函数重载中提到过,一个程序编译需要经过四个阶段,第一个阶段预处理中有一个操作是宏替换。由于是替换,所以宏不建立栈帧,且没有数据类型的限制,能够提高我们的运行效率 。但宏的缺点 也不少,例如语法容易出错,没有安全检查以及不能调试 ,所以在C++中出现了内联(inline),对其进行了改善。

宏函数

​ 首先看一个错误例子,我们想定义一个宏函数,功能是两个变量相乘,但由于宏函数是在调用处展开,导致我们想传递的值MUL(3,3)变成了MUL(1+2*1 + 2),正确写法应是#define MUL(x,y) ((x)(y)),由此可见,宏函数的定义需要严格的把控,否则很容易出现错误

内联函数

​ 内联大幅度改善了语法问题,并且也不建立栈帧

​ 但是操作数量过大时,编译器会忽略展开请求(当上百次调用时,inline就会展开上百次,导致代码膨胀生成的程序占用空间变大),宏函数也是这样。

​ 声明和定义无法分离(内联函数没有必要进入符号表,但是放在另一个函数中就可以调用,因为已经在另一个函数中展开了),能找到该函数的地址了。

范围for

范围for 搭配auto 使用,在C语言中auto用于声明变量的生存周期为自动(基本不怎么使用),在C++中auto用于自动推导表达式或变量的实际类型。

​ 例如:

​ 使用范围for可以依次将数组中的数值赋给e,并且能够自动判断结束,自动迭代 ,auto能自动推出类型,所以普通情况下用处不是很大,但是当类型名很长的时候(如迭代器)就会很有用,在后面的博客中会进一步介绍。

此外,e在常规情况下无法改变值,只能用引用"&"来进行修改

NULL与nullptr

​ 在C语言中NULL是((void*)0),而在C++中NULL被看做成了0。但函数重载中,传入NULL会进入参数为"int"的函数中。因此为了调用参数为指针的函数,并且要向前兼容,所以就出现nullptr来代表空指针,由此来做出区别:

  1. NULL是一个 ,替换的是0,nullptr是关键字,代表空指针
  2. nullptr代表空指针 ,NULL代表整型0
  3. nullptr让检查类型时避免出现歧义


相关推荐
qq13267029404 分钟前
ARM版统信UOS桌面安装JDK
java·jdk·arm·统信uos·毕昇jdk 11
码头工人20 分钟前
【架构师系列】风控场景下超高并发频次计算服务的设计与实践
java·架构·风控·反爬
上天_去_做颗惺星 EVE_BLUE30 分钟前
C++学习:学生成绩管理系统
c语言·开发语言·数据结构·c++·学习
John_ToDebug32 分钟前
Chromium WebUI 定制实践:从 C++ 注入到 JS 安全展示全链路解析
javascript·c++·chrome
长不大的蜡笔小新36 分钟前
私人健身房管理系统
java·javascript·spring boot
水饺编程38 分钟前
开源项目介绍:VirtuaNES 模拟器
c语言·c++·windows·visual studio
十五年专注C++开发43 分钟前
CMake进阶:find_package使用总结
开发语言·c++·cmake·跨平台编译
hdsoft_huge1 小时前
Java 实现高效查询海量 geometry 及 Protobuf 序列化与天地图前端分片加载
java·前端·状态模式
闻缺陷则喜何志丹1 小时前
【计算几何】平面凸包
c++·数学·扫描线·凸包·单调性·上凸包·下凸包
xiaowu0801 小时前
IEnumerable、IEnumerator接口与yield return关键字的相关知识
java·开发语言·算法