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


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


文章目录

    • 内敛函数和宏定义的区别
      • 内联函数定义和使用
        • 内联函数特点
        • 内联函数示例
      • 宏定义和使用
        • 宏定义特点
        • 宏定义示例
      • 比较总结
      • 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.niftyadmin.cn/n/5683659.html

相关文章

使用Spring Cloud Config和JCE加密配置文件的实战教程

使用Spring Cloud Config和JCE加密配置文件的实战教程 1. 前言 在微服务架构中&#xff0c;集中化管理配置文件是常见的需求。Spring Cloud Config 提供了集中化的配置管理方案&#xff0c;而在某些场景下&#xff0c;配置文件中可能包含敏感信息&#xff08;如数据库密码、A…

C++ 机器人相关面试点

C 机器人相关面试点 多功能聊天乐园 1. 功能实现&#xff1a; 用户管理&#xff1a;实现了用户注册与登录、头像上传与下载功能&#xff0c;用户密码通过OpenSSL加密&#xff0c;用户数据存储在MySQL数据库中&#xff0c;并通过XML文件进行本地持久化配置。 音乐播放与下载&a…

ACC5.【C语言】几个迫使CPU等待的语句

1.嵌入式开发插入汇编指令 插入hlt指令:让CPU停止工作进入待机状态,只要外部发生变化(按键盘点击鼠标),CPU立刻响应 插入wait指令,当8086的TEST引脚为高电平时,暂停后续指令的执行,否则继续执行 2.C语言 *需要调用库函数 #include <stdlib.h> int main() {system(&q…

无锡卓瓷X哲讯智能科技,SAP项目正式启动!

在数字化浪潮的推动下&#xff0c;高精密陶瓷行业的领军企业—无锡卓瓷科技有限公司&#xff0c;携手哲讯智能科技有限公司近期启动SAP&BI项目&#xff0c;以打造行业领先的数字化管理平台。这一战略举措标志着无锡卓瓷在数字化转型的道路上迈出了坚实的一步。 无锡卓瓷—…

Mac中访达显示/关闭隐藏文件

Mac中访达显示/关闭隐藏文件 您可以使用特殊的键盘快捷键查看 Mac 上的所有不可见项目。下面是具体步骤&#xff1a; 1、激活 Finder 应用程序&#xff0c; 打开可能包含此类文件的文件夹。 Command Shift 句点 【CMDShift.】3、如果您想再次隐藏文件&#xff0c;请再次重…

[遇到问题] Word中插入公式横线“-”变成了长连字符

1 一招解决Word里公式减号/短横线&#xff0c;在关闭word后变成连字符_word中公式短横线变成了减号-CSDN博客 2 选中横向-公式-文本&#xff08;公式文本化即可&#xff09;

BACnet协议-(基于ISO 8802-3 UDP)(2)

1、模拟设备的工具界面如下&#xff1a; 2、使用yet another bacnet explorer 用作服务&#xff0c;用于发现设备&#xff0c;界面如下&#xff1a; 3、通过wireshark 抓包如下&#xff1a; &#xff08;1&#xff09;、整体包如下&#xff1a; &#xff08;2&#xff09;、m…

CC-LINK IE Field Basic通讯设置

一、设备简介 硬件&#xff1a;R08EN、FR-E840-EPB&#xff1b; 软件&#xff1a;GX Works3、FR Configurator2&#xff1b; 二、硬件展示 三、PLC侧参数设置 1.登录配置文件&#xff08;配置文件前期博文已经分享了&#xff0c;自行下载&#xff09; 2.导航→参数→模块参数…