开场:iOS 打包踩坑实录
上周帮同事排查一个 iOS 上架问题,Xcode 编译直接报错:"Unknown type name 'namespace'"。翻了一圈代码,发现问题出在他把一段 C++ 模板代码塞进了.m文件里。Unity Editor 里跑得好好的,一出包就翻车。
这种坑只要做 Unity iOS 原生插件就必然会遇到。.h、.c、.cpp、.m、.mm——五种后缀摆在面前,新人很容易懵。Unity 桥接层一般写.mm,原因就藏在 IL2CPP 与 Unity 引擎本身的技术栈里。这篇文章把"为什么是 .mm"从文件后缀一路讲到编译器和链接器层面。
一、文件后缀与语言能力对照
1.1 五种后缀的本质差异
文件后缀不是习惯,而是给编译器前端选择语言模式的开关。Clang 看到不同后缀会启用不同的语法解析与语义规则:
| 后缀 | 语言 | 能否调用 C | 能否调用 C++ | 能否调用 Objective-C |
|---|---|---|---|---|
.c | 纯 C | ✅ | ❌ | ❌ |