当前位置: 首页 > article >正文

【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.kler.cn/a/326983.html

相关文章:

  • 推荐一款PowerPoint转Flash工具:iSpring Suite
  • CodeQL学习笔记(5)-CodeQL for Java(AST、元数据、调用图)
  • SLF4J: Failed to load class “org.slf4j.impl.StaticLoggerBinder“
  • 002-Kotlin界面开发之Kotlin旋风之旅
  • useRoute和useRouter
  • Ubuntu Linux
  • armbian安装docker
  • MongoDB的查询/超详细/表达式符号
  • SQLMap使用指南
  • Linux服务安装node,npm与yarn
  • 0-1开发自己的obsidian plugin DAY 6
  • 数据挖掘的基本步骤和流程解析:深入洞察与策略实施
  • 重修设计模式-行为型-责任链模式
  • ubuntu24.04 最好的输入法是什么?
  • 【ARM 嵌入式 编译系列 10.6 -- ARM toolchain examples】
  • 【Docker】解决Docker Engine stopped
  • cocos打包后发布web,控制台报错.plist资源下载404
  • Netty 与 WebSocket之间的关系
  • 宠物空气净化器该怎么选?希喂、美的、有哈这三款有推荐的吗?
  • 将 Go 作为脚本语言用及一些好用的包
  • 渗透测试入门学习——编写python脚本实现对网站登录页面的暴力破解
  • 自动化办公-Python中的for循环
  • 网络安全中的 EDR 是什么:概述和功能
  • 【芋道源码】gitee很火的开源项目pig——后台管理快速开发框架使用笔记(微服务版之本地开发环境篇)
  • 计算机网络面试题——第二篇
  • java中创建jdbc应用程序