【C++】007、宏与inline的区别

二叉树高度定义与C/C++实现陷阱解析 二叉树高度是数据结构中最基础也最易误解的概念之一,其本质是从根节点到最远叶子节点的最长路径所含边的数量。该定义直接决定递归基设计、空树处理逻辑及算法正确性。在C/C++工程实践中,空指针判定(NULL vs nullptr)、内存布局对齐、栈溢出风险、编译器优化差异等底层因素,都会导致看似正确的代码在边界场景下失效。尤其当涉及AVL平衡判断、层序遍历或嵌入式环境时,高度计算的鲁棒性直接影响系统稳定性。本文结合调试实证、汇编分析与生产级模板,系统梳理从数学定义到工业落地的关键断点。 阅读详情

一、根本区别

宏是无脑的文本替换:

  • 在预处理阶段机械替换,不经过编译器语义检查

inline是有脑的编译器建议:

  • 本质是带类型检查的函数,但最终是否内联展开,由编译器根据复杂、优化级别决定

二、四大核心区别

对比

宏函数#define

inline函数

处理阶段

预处理阶段(纯文本替换,不编译)

编译阶段(编译器会尝试内联展开)

类型检查

无

严格的类型检查

参数求值

会多次求值(存在副作用)

只求值一次

调试能力

无法调试

可打断点调试

作用域

全局污染

遵循C++作用域规则

  • 代码展示多次求值的副作用

#define SQUARE(x) ((x) * (x))

inline int square(int x) { return x * x; }

int main() {
    int a = 3;
    int b = 3;
    int r1 = SQUARE(++a); // 展开: ((++a) * (++a)) => a 变成了 5,结果是 5*5=25(UB,结果取决于编译器)
    int r2 = square(++b); // 先计算 ++b(b=4),传进去,结果为 16。安全!
}

三、inline失效的四大场景

1)、编译器认为函数太复杂,存在代码膨胀情况而进行拒绝

  • 场景:函数体包含循环(for/while),递归,switch分支过多,或静态变量声明时,编译器通常会自动忽略inline请求,把它当做普通函数进行处理

inline int factorial(int n) { 
    return n <= 1 ? 1 : n * factorial(n - 1); // ❌ 递归,编译器基本不会内联
}
inline int complex_calc() {
    int sum = 0;
    for (int i = 0; i < 1000; ++i) sum += i; // 循环太长,通常不会内联
    return sum;
}

2)、函数通过函数指针调用

  • 场景:当把inline函数赋值给函数指针,或者通过函数指针回调时,编译器必须生成该函数的实际地址(可执行实体),此时内联无法展开

inline void printHello() { std::cout << "Hello"; }

void invoke(void (*func)()) { func(); }

int main() {
    void (*ptr)() = printHello; // 获取了地址,编译器被迫生成真实的函数体
    invoke(ptr);                // 这里调用的是函数指针,无法内联
}

3)、虚函数调用(动态多态)

  • 场景:通过基类指针或引用调用virtual inline函数时,由于调用目标在运行时才能确定(查虚表),编译器无法再编译期展开内联函数

class Base { public: virtual inline void foo() {} };
class Derived : public Base { public: void foo() override {} };

void test(Base* b) {
    b->foo(); // 运行时多态,无法内联(除非编译器能确定b的确切类型并去虚拟化)
}

4)、构造、析构函数

  • 构造函数在头文件的类体内,如果变量很多的话,编译器会拒绝内联

四、inline的底层本质

  • inline对于编译器而言,只是建议,不是命令,会根据情况,有可能不会展开

五、现代C++替代宏函数

  • 替代普通宏函数:使用 inline函数+模板

  • 替代类型通用宏: 使用auto + 模板

  • 编译期常量计算宏: 使用constepr

微带天线理论学习笔记(1) 微带天线的概念是由Deschamps于1953年提出来的,它是在一块厚度远小于工作波长的介质基片的一面敷以金属辐射片、一面全部敷以金属薄层作接地板而成。辐射片可以根据不同的要求设计成各种形状。微带天线具有质量轻、体积小和易于制造等优点,广泛应用于个人无线通信中。 阅读详情

相关推荐

VS2022打包C#安装包(最新、最全)

VS2022打包C#安装包(最新、最全)

qq_37959253的博客 9899

c++内联函数(inline)及内联函数的使用及注意点

以下转自:http://www.jb51.net/article/48622.htm 介绍内联函数之前,有必要介绍一下预处理宏。内联函数的功能和预处理宏的功能相似。相信大家都用过预处理宏,我们会经常定义一些宏,如 复制代码 代码如下: #define TABLE_COMP(x) ((x)>0?(x):0) 就定义了一个宏。 为什么要使用宏呢?因为函数的

wyq_tc25的博客 7573

带隙基准电路设计实战:从HSPICE仿真到Virtuoso版图全流程解析

在模拟集成电路设计中,基准电压源是确保系统精度与稳定性的核心模块。其基本原理在于巧妙结合具有正、负温度系数的电压,通过加权求和实现近似零温度系数的稳定输出,这一特性对于高精度数据转换器、电源管理芯片等至关重要。从工程实践角度,利用HSPICE进行深入的直流工作点、温度扫描和工艺角仿真,是验证电路性能、优化温度系数和电源抑制比的关键步骤。而借助Cadence Virtuoso进行版图实现时,必须重点关注电阻与BJT的匹配布局、敏感节点的保护以及电源完整性设计,以确保设计意图在硅片上得以准确呈现。通过完整的从前

weixin_29181861的博客 286

内联函数的使用及注意点

内联函数并不总是内联 Inline function是在C++中引入的一种机制,它可以拓展函数代码,避免调用函数的额外开销。在Linux环境下,gcc编译选项必须加上优化选项才能使inline有效。 inline与static的关系 在这儿有一个比较详细的分析:http://www.cnblogs.com/xkfz007/articles/2370640.html 内联函数(in

benpaobagzb的博客 1175

基于Joplin和Joplin Server搭建私有云笔记

我们知道,多端同步功能是笔记工具最重要的功能。只有实现了多端同步,我们才能在工作电脑和手机之间无缝切换笔记体验。Joplin 在同步上做得不错,支持 Dropbox、OneDrive 和 AWS s3(当然国内都没法用),支持 WebDAV 协议,也支持自家的 Joplin Server。 本文介绍如何在自己的服务器上搭建 Joplin Server,并配置好 Joplin Desktop 的同步功能。 前置条件 安装docker 创建 Joplin Server 配置文件 创建配置文件,~/docke

代码时光 1万+

C/C++ 计算程序运行的时间

C/C++计算程序执行时间的方法,精度依次增加,推荐度也依次增加 1.#include <time.h> clock_t start, finish; double process_interval ; start=clock(); process(); //要计时的程序 finish=clock(); process_interval =(double)(finish-star...

stu_shanghui的博客 1020

IT 常见面试题总结

经历过的面试题总结

王学斌的博客 2445

C#串口通信从入门到精通(27)——高速通信下解决数据处理慢的问题(20ms以内)

本文介绍如何在高速通信情况下解决串口接收的数据来不及处理的问题,由高级工程师多年经验总结而成,绝对是串口领域的实战经验!

qq_34059233的博客 6808

C++基础-this指针/内联函数

this指针,inline内联函数,宏定义,默认内联函数

shuaixio的博客 776

UG NX二次开发(C#)-VS2022配置NX二次开发模板不能正常显示的问题

随着VS2022的发布,使用VS2022进行UG NX二次开发的人员也会越来越多,但是由于VS2022和以前的VS版本采用代码结构不同,而UG NX的二次开发编程模板还没有适应于VS2022的模板配置,所以不能正常的创建一个完整的工程。本文采用曲线救国的方式来实现VS2022下的UG NX二次开发。如果有读者能很好的解决模板配置,不吝赐教。

GimiGimmy 4274

STM32+ESP8266+MQTT协议连接阿里云物联网平台

一、环境介绍 单片机采用:STM32F103C8T6 上网方式:采用ESP8266,也可以使用其他设备代替,只要支持TCP协议即可。比如:GSM模块、有线网卡等。 开发软件:keil5 二、实现功能 通过阿里云物联网服务器实现设备数据远程上传、下发,实现数据交互。 在当前使用的开发板上有4盏LED灯、一个蜂鸣器、4个按键。 三、阿里云物联网服务器创建步骤 说明:如果没有账号的话,先点击网页右上角,注册一个账号,并完成实名认证再继续下一步。 产品名称根据自己情况填...

6万+

C++基础入门

无

丰锋的博客 2645

人工智能在软件测试中的广泛应用领域

人工智能在软件测试中的应用领域涵盖了自动化测试、缺陷预测和缺陷检测、智能化测试报告生成等方面。以上提供的示例代码只是其中的一小部分,实际上,人工智能在软件测试中还有许多其他的应用。通过结合人工智能和软件测试,可以提高测试效率和质量,减少测试工作的人力成本,并帮助开发人员更好地理解和改进软件产品。人工智能(Artificial Intelligence,简称AI)在软件测试领域的应用越来越广泛。下面将介绍几个人工智能在软件测试中的主要应用领域,并提供一些相关的源代码示例。

FycPerformance的博客 462

内联函数的使用以及注意点

转自:http://www.cnblogs.com/xkfz007/archive/2012/03/27/2420166.html 内联函数并不总是内联 Inline function是在C++中引入的一种机制,它可以拓展函数代码,避免调用函数的额外开销。在Linux环境下,gcc编译选项必须加上优化选项才能使inline有效。 inline与static的关系 在这儿有一个比

Miles的专栏 742

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

内联函数的使用

原文:http://blog.youkuaiyun.com/helinlin007/article/details/8112091 在C++中时常会提到内联函数的概念,而内联函数在C++中的使用也是相当普遍的。从内联函数的定义上可以知道,内联函数在使用上有类似宏替换的作用,即在对程序进行编译的时候,直接使用程序的函数体来代替函数名。 内联函数的种类: 内联函数主要分成两种,一种是类成员内部的内联函数

小许子的博客 751

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

coreboot C 编码风格指南:从缩进、命名到错误处理与内存分配的全量规范解析

本文以 [Documentation/contributing/coding_style.md](https://link.gitcode.com/i/27992835572bccb5dd8709d4cc740df3) 为骨架,系统解析 coreboot 项目官方的 C 语言编码风格规范。该规范与 Linux 内核编码风格高度同源,覆盖缩进与行宽、花括号与空格、命名与 typedef、函数设计、g

gitblog_00682的博客 755

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

内联函数学习

内联函数是指用inline关键字修饰的函数。在类内定义的函数被默认成内联函数。   定义:内联函数从源代码层看,有函数的结构,而在编译后,却不具备函数的性质。内联函数不是在调用时发生控制转移,而是在编译时将函数体嵌入在每一个调用处。编译时,类似宏替换,使用函数体替换调用处的函数名。一般在代码中用inline修饰,但是能否形成内联函数,需要看编译器对该函数定义的具体处理。   动机:内联扩展

一步一步往上爬~~~ 489

DML vs CUDA + TensorRT:sunone_aimbot_2两种版本构建终极对比指南

sunone_aimbot_2 是一个基于 AI 的 FPS/TPS 游戏辅助瞄准工具,提供 **DML(DirectML)** 与 **CUDA + TensorRT** 两种 GPU 推理版本:前者兼容所有显卡、开箱即用,后者专为 NVIDIA 显卡压榨极限性能。本文带你快速搞懂两者的核心差异、硬件要求和构建步骤,一次选对适合你的版本。 ## 30 秒快速选择:DML 还是 CUDA? 不

gitblog_00090的博客 465

.NET 10 SDK 安装指南:5 分钟装好 LTS 环境,含安装命令、验证与避坑

装好 .NET 10 SDK 后,你可以直接写 C#、建项目、跑应用,`dotnet new console` 接 `dotnet run` 就是你的第一个成品。.NET 10 是 LTS 版本,官方支持到 **2028 年 11 月**,装一次就长期可用。本文带你按操作系统走一遍完整安装,最后用一条命令确认装好,全程 5 分钟。 ## 30 秒选型:我该走哪条路 | 你的情况 | 推荐路径

gitblog_00661的博客 283

CSS虚线实现全解析:从border到渐变与border-image的进阶技巧

在网页设计与前端开发中,CSS边框与背景样式是构建视觉层次的基础技术。其核心原理在于通过盒模型控制元素的表现层,其中虚线作为一种常见的视觉元素,在表单焦点提示、内容分隔等场景中具有重要技术价值。传统border属性虽简单高效,但无法自定义虚线样式,这促使开发者探索更灵活的解决方案。通过CSS渐变(linear-gradient)与background属性的结合,可以实现高度自定义的虚线图案,包括渐变色彩与多方向虚线;而border-image属性则为圆角虚线边框提供了原生支持。本文聚焦于虚线间隔控制与渐变虚

aoe41606的博客 742

Python数据可视化实战:从Matplotlib习题到企业级应用

数据可视化是数据分析与呈现的关键环节,其核心在于将抽象数据转化为直观图形,以揭示模式、趋势和洞见。其原理基于视觉编码理论,通过位置、长度、颜色、形状等视觉通道映射数据维度。在Python生态中,Matplotlib作为最基础且强大的绘图库,提供了从简单图表到复杂出版级图形的完整解决方案,其面向对象的API设计允许对图形元素进行像素级控制。掌握Matplotlib不仅能完成基础的折线图、柱状图绘制,更是深入理解**多子图布局**、**分组柱状图**等高级可视化技术、构建自动化数据报告仪表盘的基石。在工程实践中

weixin_34060299的博客 386

STM32软件SPI驱动ST7735R TFT-LCD实战指南

SPI是一种同步串行通信协议,其核心在于时钟极性(CPOL)与相位(CPHA)的精确配置,以及主从设备间的数据采样时机控制。在嵌入式系统中,当硬件SPI资源受限或需深度调试时,软件SPI成为关键替代方案——它通过GPIO模拟SCK、MOSI、NSS等信号,以可读、可控、可测的方式实现协议物理层行为。该技术显著提升调试可见性,支持示波器级时序验证,并增强对ST7735R等敏感显示驱动芯片的初始化容错能力。典型应用场景包括STM32F103等资源受限MCU驱动1.8寸TFT-LCD、毕业设计快速原型开发、HMI

weixin_34195364的博客 221

Block重复导致ClickHouse Attach Part静默失败原因探究

本文分析了ClickHouse ETL流程中因数据去重机制导致的Attach失败问题。通过日志发现,两个不同Part因共享相同Block ID(指纹)被判定为重复,触发deduplication机制,导致后续Attach被跳过。根本原因在于ClickHouse基于Block ID进行去重,即使Part文件不同,只要内容一致即视为重复。文章深入解析了Block ID生成、Part生命周期及去重机制,揭示了ClickHouse对数据一致性与高效存储的设计理念,并提出避免重复插入的解决方案。

小昌昌的博客 115

视频隐私脱敏工程化:CSRT/KCF追踪算法在本地推理中的实现与边界

在短视频内容合规审查中,动态遮挡(Dynamic Masking)是高频且高耗时的环节。传统手动关键帧打码不仅效率低下,且在目标快速移动或遮挡时极易出现遮罩漂移。本文从计算机视觉工程角度,解析基于CSRT与KCF算法的目标追踪方案在视频隐私处理中的技术路径、性能权衡及落地实践。

Mysssone的博客 203

【算法拾光】链表 哈希表|K个一组翻转链表 + 两数之和

K个一组翻转链表需分段反转,借助哑节点与前驱指针维护连接,避免断链;两数之和利用哈希表实现O(1)查找,空间换时间,高效定位目标组合。前者考察链表指针操作,后者聚焦映射关系构建,均为面试高频题。

wuqingyigexiaoba的博客 312
上一篇: 【C++】006、#define与const的区别
下一篇: 【C++】008、sizeof与strlen的区别
Tim_10
博客等级 码龄2年 162粉丝 106原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值