这涉及 GCC 对inline的底层处理机制。GCC 的inline扩展体现在符号发射规则上这是 GNU89 和 C99 最核心的差异点。GNU89 的inline语义GCC 自创在-stdgnu89下GCC 对inline函数的规则是// 某个 .h 头文件中inlineintadd(inta,intb){returnab;}情况GCC 的行为编译器决定内联展开不生成独立的函数符号无外部符号编译器决定不内联如函数太复杂不会自动生成一个可供链接的外部符号后果如果编译器不内联链接器找不到符号 →链接报错 undefined reference。所以在 GNU89 下你必须在某个.c文件里再提供一个外部定义// 某个 .c 文件中必须补充这一行来兜底externintadd(inta,intb);// 或直接写非inline的定义这个行为是 GCC自己发明的C89 标准根本没有描述过这件事。C99 的inline语义标准化后改了规则C99 把规则反过来了// .h 中inlineintadd(inta,intb){returnab;}编译器内联 → 没有外部符号同上编译器不内联 →也没有外部符号同上但 C99 规定你必须在恰好一个.c文件里提供extern inline定义作为外部定义由链接器使用// 恰好一个 .c 文件中externinlineintadd(inta,intb);// C99这才是生成外部符号的那个static inline为什么两者都兼容回到你贴的代码staticinlinemy_uint64_tcmnN2H64_LE(my_uint64_tv64){...}static直接解决了上述所有麻烦static 每个编译单元各自拥有一份独立副本不需要外部符号不存在跨编译单元的链接问题GNU89 / C99 / C98 下语义完全一致所以这个写法在 GNU89 时代就是绕开 inline 语义差异的标准惯用法老项目里大量使用正是出于这个原因。总结一句话GCC 的扩展体现在它自己规定了一套inline函数的符号发射规则内联成功则不发射符号不内联则依赖外部兜底定义这套规则既不是 C89 标准的内容也和后来 C99 的标准化方案不同。static inline则是绕过这一差异、实现跨标准兼容的惯用解法。