0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

C语言中的内联函数与宏

麦克泰技术 来源:麦克泰技术 2025-07-25 15:10 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

在C编程中,内联函数和宏都用于避免函数调用的开销并编写可复用的逻辑部分,但它们在工作方式和安全性方面存在显著差异。

内联函数

使用`inline`关键字声明(在C99中引入)。

用途:建议编译器将函数代码直接嵌入到调用位置,以减少调用开销。

优点:

1. 类型安全:编译器会强制检查参数类型和返回类型是否正确。

2. 有作用域:遵循C语言的作用域规则,避免变量名冲突。

3. 可调试:可以被跟踪和调试(除非被编译器内联)。

缺点:

1. 内联不保证:编译器仍可能生成常规的函数调用。

2. 存在代码膨胀风险:过度使用可能因多次复制代码导致二进制文件体积变大。

示例:

999f3b84-66a9-11f0-a6aa-92fbcf53809c.png

使用`#define`指令定义;由预处理器通过文本替换处理。

优点:

1. 灵活性:可用于任何类型,因为没有类型检查。

2. 扩展有保证:宏代码总会替换调用位置。

缺点:

1. 无类型检查:编译器不会验证参数类型,可能导致难以发现的错误。

2. 副作用:可能多次计算参数(例如`MAX(a++,b++)'),导致意外行为。

3. 无作用域:宏名是全局的,可能导致冲突或意外重定义。

4. 难以调试:在编译前展开,使得调试更加困难。

示例:

99af989e-66a9-11f0-a6aa-92fbcf53809c.png

主要差异——要点总结

定义方式:

1. 内联函数使用`inline`声明,正常编译。

2. 宏使用`#define`定义,由预处理器展开。

安全性:

1. 内联函数类型安全且有作用域。

2. 宏不安全,没有类型检查且无作用域。

调试:

1. 内联函数更容易调试。

2. 宏在编译前展开,使得调试困难。

内联/扩展保证:

1. 内联函数可能被内联,也可能不被内联(由编译器决定)。

2. 宏总会被预处理器展开。

最佳使用场景:

1. 当安全性、作用域和可读性是优先考虑的因素时,使用内联函数。

2. 仅在必要时使用宏(例如,用于条件编译或简单常量)。

麦克泰技术走过了30年发展历程(1995-2025),秉承“让嵌入式软件开发更容易”的理念,致力于推广嵌入式软件开发工具、测试软件和嵌入式操作系统。麦克泰技术通过举办嵌入式软件和操作系统研讨会、开设培训课程、出版图书,撰写博客文章,倡导和宣传开放和开源的嵌入式软件、操作系统以及开发技术,包括VRTX(90年代)、µC/OS(2000年),Montavista Linux(2010年)和FreeRTOS(2010年)以及IAR/BDI/J-Link等知名的产品和技术。

麦克泰技术具有丰富嵌入式软件项目开发、行业应用与服务经验。今天,我们依托欧美嵌入式软件商业团队支持,提供嵌入式软件商业授权和服务。包括(不限于)SEGGER嵌入式软件开发和编程工具(J-Link/Flasher),OS分析工具Tracealyzer,WITTENSTEIN公司的SafeRTOS(FreeRTOS)、Flexible Safety RTOS(µC/OS-II MPU)以及新一代PX5 RTOS。麦克泰技术专注预认证功能安全操作系统在汽车、轨交、医疗和工业领域的应用以及RISC-V处理器嵌入式开发生态建设。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • C语言
    +关注

    关注

    183

    文章

    7642

    浏览量

    144609
  • 函数
    +关注

    关注

    3

    文章

    4406

    浏览量

    66838
  • 编译器
    +关注

    关注

    1

    文章

    1669

    浏览量

    51081

原文标题:C语言中的内联函数与宏

文章出处:【微信号:麦克泰技术,微信公众号:麦克泰技术】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    C语言中预定义的用法和使用场景

    C语言中,预定义是由编译器提供的一组特殊标识符,可以在程序中直接使用,无需进行额外的定义。
    发表于 08-16 16:12 901次阅读

    C语言中函数的基本知识

    函数C语言中的基本构建块之一,它允许我们将代码组织成可重用、模块化的单元。
    发表于 08-16 18:25 923次阅读

    C语言中定义的应用

    C语言中定义是一种预处理指令,用于在代码中定义和使用常量、函数或代码片段的替代。
    发表于 08-17 15:33 1375次阅读

    C语言中定义的使用技巧

    #define命令是C语言中的一个定义命令,它用来将一个标识符定义为一个字符串,该标识符被称为名,被定义的字符串称为替换文本。
    发表于 09-05 10:12 1876次阅读
    <b class='flag-5'>C</b><b class='flag-5'>语言中</b><b class='flag-5'>宏</b>定义的使用技巧

    C语言中是什么

    第五章 性能优化5.1 使用定义  在C语言中是产生内嵌代码的唯一方法。对于嵌入式系统而言,为了能达到性能要求,是一种很好的代替
    发表于 12-15 08:20

    Java之内联函数_内联函数的优缺点

    内联函数就是指函数在被调用的地方直接展开,编译器在调用时不用像一般函数那样,参数压栈,返回时参数出栈以及资源释放等,这样提高了程序执行速度。Java
    发表于 12-15 15:00 4005次阅读

    C++基础语法之inline 内联函数

    上节我们分析了C++基础语法的const,static以及 this 指针,那么这节内容我们来看一下 inline 内联函数吧! inline 内联
    的头像 发表于 09-09 09:38 2636次阅读

    C++语法中的inline内联函数详解

    上节我们分析了C++基础语法的const,static以及 this 指针,那么这节内容我们来看一下 inline 内联函数吧! inline 内联
    的头像 发表于 09-09 09:33 3863次阅读

    C语言-内联函数、递归函数、指针函数

    这篇文章介绍C语言内联函数、递归函数函数指针、指针函数
    的头像 发表于 08-14 10:03 2367次阅读

    C语言中定义

    #define命令是C语言中的一个定义命令,它用来将一个标识符定义为一个字符串,该标识符被称为名,被定义的字符串称为替换文本。命令有两种格式:一种是简单的
    的头像 发表于 09-28 16:05 4330次阅读
    <b class='flag-5'>C</b><b class='flag-5'>语言中</b>的<b class='flag-5'>宏</b>定义

    讲解下C语言内联函数

    内联函数C语言C++中借鉴过来的,适当的使用内联函数
    的头像 发表于 02-16 09:15 2056次阅读

    C语言内联函数,提升C技巧必备

    内联函数C语言C++中借鉴过来的,适当的使用内联函数
    的头像 发表于 02-16 09:16 1283次阅读

    C语言内联函数

    调用内联函数的地方( 可以与函数做类比 ),在调用处将代码展开,相当于自动将函数B的代码在调用它的地方复制了一份副本,没有了保护现场和恢复
    的头像 发表于 02-21 16:55 1656次阅读
    <b class='flag-5'>C</b><b class='flag-5'>语言</b><b class='flag-5'>内联</b><b class='flag-5'>函数</b>

    C语言中函数的定义和用法

    函数是一种特殊的函数,与普通函数不同的是,它可以拥有多条语句和局部变量,从而实现更复杂的功
    发表于 10-11 11:32 4814次阅读
    <b class='flag-5'>C</b><b class='flag-5'>语言中</b><b class='flag-5'>宏</b><b class='flag-5'>函数</b>的定义和用法

    的缺陷与内联函数的引入

    。 所以为了解决这种不利于调试的问题,就有了内联函数。 那么什么是内联函数呢? 我们以inline修饰的函数叫做
    的头像 发表于 11-01 17:57 894次阅读