【ARM 嵌入式 C 入门及渐进26 -- 内敛函数和宏定义的区别】

server/2024/9/29 21:29:33/


请阅读嵌入式及芯片开发学必备专栏


文章目录

    • 内敛函数和宏定义的区别
      • 内联函数定义和使用
        • 内联函数特点
        • 内联函数示例
      • 宏定义和使用
        • 宏定义特点
        • 宏定义示例
      • 比较总结
      • Sumamry

内敛函数和宏定义的区别

在 C 语言中,内联函数和宏定义都可以用来减少函数调用的开销和提高代码执行效率,但它们在许多方面存在显著区别。以下是内联函数和宏定义的详细比较:

内联函数定义和使用

内联函数使用 inline 关键字定义。例如:

inline int add(int a, int b){return a + b;
}

使用时和普通函数一样:

int result = add(3, 5);
内联函数特点
  1. 类型安全:内联函数是强类型的,类型检查在编译时进行。
  2. 调试友好:内联函数支持调试,调试器可以跟踪内联函数的调用。
  3. 作用域:内联函数遵循作用域规则,通常在声明它们的文件或作用域内有效。
  4. 可维护性:内联函数易于维护和调试,函数的行为和实现清晰明确。
  5. 编译器优化:编译器可以选择性地内联函数,如果认为内联会导致代码膨胀或性能下降,它可能不会内联。
内联函数示例
#include <stdio.h>inline int add(int a, int b) 
{return a + b;
}int main(void) 
{int result = add(3, 5);printf("Result: %d\n", result);return 0;
}

宏定义和使用

宏定义使用 #define 预处理指令。例如:

#define ADD(a, b) ((a) + (b))

使用时像函数调用一样,但实际上是在预处理阶段进行替换:

int result = ADD(3, 5);
宏定义特点
  1. 无类型检查:宏是文本替换,没有类型检查,可能导致类型错误。
  2. 调试困难:宏替换在预处理阶段完成,难以在调试器中跟踪宏的行为。
  3. 全局作用域:宏在定义后全局有效,可能引起命名冲突和作用域污染。
  4. 维护复杂:宏替换简单但容易出错,逻辑复杂时难以维护。
  5. 性能优化:宏是简单的文本替换,不涉及编译器优化。
宏定义示例
#include <stdio.h>
#define ADD(a, b) ((a) + (b))int main(void) 
{int result = ADD(3, 5);printf("Result: %d\n", result);return 0;
}

比较总结

特性内联函数宏定义
类型检查
调试支持支持不支持
作用域遵循 C 语言作用域规则全局作用域
错误检测编译时进行类型和语法检查预处理期间简单替换,错误难以检测
参数求值每个参数求值一次多次求值可能导致副作用
易维护性

Sumamry

尽管内联函数和宏都有提高运行效率的作用,但应优先考虑使用内联函数,除非确有需要宏定义的场景(如条件编译)。内联函数提供了更好的类型安全性、可维护性和调试支持。


http://www.ppmy.cn/server/124659.html

相关文章

Oracle 19c 使用EMCC 监控当前所有数据库

一.EMCC简介 EMCC&#xff0c;全称Oracle Enterprise Manager Cloud Control&#xff0c;是Oracle提供的一套集中化监控工具&#xff0c;可以对数据库、操作系统、中间件等进行监控&#xff0c;通过OMS&#xff08;Oracle Management Service&#xff09;收集监控数据并将监控信…

不同类型RWA在智能合约开发中的差异

RWA&#xff08;现实世界资产&#xff09;的类型多样&#xff0c;从房地产、艺术品到股票、债券等&#xff0c;每种资产的特性、价值评估方式、监管要求等都存在差异。这些差异直接影响到智能合约的设计和开发。 1.房地产RWA 复杂性高&#xff1a; 房地产涉及到土地使用权、建…

技术成神之路:设计模式(十五)中介者模式

介绍 中介者模式&#xff08;Mediator Pattern&#xff09;是一种行为型设计模式&#xff0c;用于减少对象之间的复杂通信和依赖。它通过引入一个中介者对象来封装对象之间的交互&#xff0c;从而使得对象之间不直接相互依赖&#xff0c;而是通过中介者进行通信。 1. 定义 中介…

docker和docker-compose安装

文章目录 一、问题背景二、脚本代码三、可能出现的问题四、手动安装1、上传文件2、授权3、检查版本 一、问题背景 我们在linux上通过docker部署应用时&#xff0c;需要先安装docker和docker-compose&#xff0c;每次安装时&#xff0c;都要参考文章&#xff0c;进行一系列操作&…

c++模拟真人鼠标轨迹算法

一.鼠标轨迹算法简介 鼠标轨迹底层实现采用 C / C语言&#xff0c;利用其高性能和系统级访问能力&#xff0c;开发出高效的鼠标轨迹模拟算法。通过将算法封装为 DLL&#xff08;动态链接库&#xff09;&#xff0c;可以方便地在不同的编程环境中调用&#xff0c;实现跨语言的兼…

做了一个 byd 编辑器插件,用户再也不汪汪叫了。。。

引言 大家好&#xff0c;我是程序员 K.N&#xff0c; 一个试图用代码和世界重新打结的前端小白~ 先叠个甲&#xff0c;byd ByteMD&#xff0c;小小的标题党一下&#xff0c;各位看官老爷轻喷。 前段时间&#xff0c;我们团队做了个面试刷题工具——面试鸭&#xff0c;而我也…

【linux】进度条

&#x1f525;个人主页&#xff1a;Quitecoder &#x1f525;专栏&#xff1a;linux笔记仓 目录 01.屏幕缓冲区换行&#xff08;LF, \n&#xff09;和回车&#xff08;CR, \r&#xff09;换行回车在屏幕缓冲区中的作用代码块1&#xff1a;代码块2&#xff1a; 02.进度条优化版…

2024年7天自学网络安全(黑客技术)进阶手册。

&#x1f91f; 基于入门网络安全/黑客打造的&#xff1a;&#x1f449;黑客&网络安全入门&进阶学习资源包 前言 什么是网络安全 网络安全可以基于攻击和防御视角来分类&#xff0c;我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术&#xff0c;而“蓝队”、…