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

GCC 的 inline 扩展,和c99 inline规则的异同,static inline的统一

这涉及 GCC 对inline的底层处理机制。

GCC 的inline扩展:体现在"符号发射规则"上

这是 GNU89 和 C99 最核心的差异点。

GNU89 的inline语义(GCC 自创)

-std=gnu89下,GCC 对inline函数的规则是:

// 某个 .h 头文件中inlineintadd(inta,intb){returna+b;}
情况GCC 的行为
编译器决定内联展开不生成独立的函数符号(无外部符号)
编译器决定不内联(如函数太复杂)不会自动生成一个可供链接的外部符号

后果:如果编译器不内联,链接器找不到符号 →链接报错 undefined reference

所以在 GNU89 下,你必须在某个.c文件里再提供一个外部定义

// 某个 .c 文件中,必须补充这一行来"兜底"externintadd(inta,intb);// 或直接写非inline的定义

这个行为是 GCC自己发明的,C89 标准根本没有描述过这件事。


C99 的inline语义(标准化后改了规则)

C99 把规则反过来了:

// .h 中inlineintadd(inta,intb){returna+b;}
  • 编译器内联 → 没有外部符号(同上)
  • 编译器不内联 →也没有外部符号(同上)
  • 但 C99 规定:你必须在恰好一个.c文件里提供extern inline定义作为"外部定义",由链接器使用
// 恰好一个 .c 文件中externinlineintadd(inta,intb);// C99:这才是生成外部符号的那个

static inline为什么两者都兼容?

回到你贴的代码:

staticinlinemy_uint64_tcmnN2H64_LE(my_uint64_tv64){...}

static直接解决了上述所有麻烦:

static = 每个编译单元各自拥有一份独立副本
  • 不需要外部符号
  • 不存在跨编译单元的链接问题
  • GNU89 / C99 / C++98 下语义完全一致

所以这个写法在 GNU89 时代就是绕开 inline 语义差异的标准惯用法,老项目里大量使用正是出于这个原因。


总结一句话

GCC 的扩展体现在:它自己规定了一套inline函数的符号发射规则(内联成功则不发射符号,不内联则依赖外部兜底定义),这套规则既不是 C89 标准的内容,也和后来 C99 的标准化方案不同。static inline则是绕过这一差异、实现跨标准兼容的惯用解法。

http://www.jsqmd.com/news/952347/

相关文章:

  • 用Python+OpenCV复现1952年植物光谱实验:从叶片颜色到叶绿体提取,手把手教你做高光谱分析
  • TI XDS100V3仿真器‘失忆’了?别慌,用FTProg和这个XML文件5分钟救活它
  • 【无敌数据驱动】【自动驾驶】一种数据驱动的优化前馈补偿器的方法,用于自动驾驶汽车控制研究(Matlab代码实现)
  • 一个蹩脚机器人的重生:从10欧元玩具到让孩子疯狂的AI伙伴
  • 从房价预测到广告点击:吴恩达《神经网络与深度学习》第一周,我搞懂了监督学习的6个实战场景
  • 告别单核苦力!手把手教你用DSP6678的MPAX实现多核镜像共享(附完整工程配置)
  • 别再折腾Guest账户了!Win10/11局域网文件共享,用这个‘凭据管理器’方法更稳更快
  • 华为WLAN三层漫游实战:旁挂组网下,如何让不同VLAN的AP无缝切换不掉线?
  • 【绝密内参】央企智能档案平台上线前必做的9项AI兼容性审计(附ISO/IEC 27001+DA/T 70双标检测表)
  • 蒙特卡洛仿真教学实践包:双语课件+投资组合/面积估算/方差缩减全功能示例代码
  • 解密Sunshine游戏串流:技术架构与跨平台部署方案深度解析
  • 用Python处理FY4A雷电数据(LMI)的保姆级教程:从netCDF文件到可视化闪电地图
  • 从仿真到实测:HFSS威尔金森功分器设计如何与矢量网络分析仪(VNA)测试结果对标?
  • NGA论坛优化摸鱼体验脚本:3分钟打造你的专属高效浏览神器
  • 告别低效循环:深度解读NumPy广播与向量化如何加速你的深度学习代码
  • 动力锂电池的建模、状态估计及管理策略优化【附仿真】
  • Linux程序崩溃了别慌!手把手教你用GDB分析core文件定位段错误
  • 从‘一根天线’到‘一对IQ信号’:聊聊LTE高效传输背后的‘复信号’思维
  • Python大麦网自动抢票终极指南:如何用300行代码实现毫秒级响应系统
  • 3步轻松配置OBS本地AI语音识别字幕:LocalVocal免费隐私方案
  • DICOM文件不只是张图:拆解CT影像里隐藏的500+个信息字段(含Tag查询手册)
  • 模板小程序制作公司哪家质量高?模板多不等于质量高,关键看这四层
  • Claude 4.8架构升级实战:从单模型到多模型编排的设计演进
  • 基于51单片机的病床呼叫系统(设计源文件+万字报告+讲解)(支持资料、图片参考_降重降ai)_文章底部可以扫码
  • 【2024智能运维生死线】:AI工具未与变更系统深度耦合=持续交付裸奔(含CI/CD流水线改造checklist)
  • DS4Windows完整指南:让PS4/PS5手柄在Windows上完美运行
  • 解锁FDTD高级建模:用‘旋转体’功能自定义任意轴对称结构(从圆锥到异形件)
  • 保姆级教程:从零到一,用Prometheus+Grafana监控你的Linux服务器、MySQL和Redis
  • 阵列综合与天线雷达截面控制技术解析【附仿真】
  • Win11Debloat终极指南:一键提升Windows 11性能51%的免费神器