有 AI 了记博客(还是从AI搬过来的笔记)好像没什么必要了….
inline namespace
是一个 C++11 引入的非常实用的工具,适合做:
- 📦 库版本控制 / ABI 隔离
- 🔌 插件或模块系统的版本兼容
- ⚙️ 对外接口稳定,对内灵活演进
下面我们用一个简单例子来一步步讲清楚怎么用 👇
✅ 1. 最基本用法
1 2 3 4 5 6 7
| namespace mylib { inline namespace v1 { void hello() { std::cout << "Hello from v1\n"; } } }
|
你可以这样使用:
1 2
| mylib::hello(); mylib::v1::hello();
|
✅ 2. 加入多个版本 —— 新版本可以共存
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| namespace mylib { inline namespace v2 { void hello() { std::cout << "Hello from v2\n"; } }
namespace v1 { void hello() { std::cout << "Hello from v1\n"; } } }
|
此时:
1 2 3
| mylib::hello(); mylib::v1::hello(); mylib::v2::hello();
|
✅ 3. inline namespace 的实际用途
比如你写了一个游戏 AI 库 ai::
, 你可以这样组织:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| namespace ai { inline namespace v2025_04 { struct Behavior { void tick() const { std::cout << "tick v2025_04\n"; } }; }
namespace v2023_12 { struct Behavior { void tick() const { std::cout << "tick v2023_12\n"; } }; } }
|
使用者默认写:
1 2
| ai::Behavior b; b.tick();
|
旧代码还能写:
1 2
| ai::v2023_12::Behavior old_b; old_b.tick();
|
🧠 实践建议
目的 |
怎么做 |
维护 ABI |
给实现放进 inline namespace ,防止链接冲突 |
版本演进 |
用多个 namespace vxxxx_xx 组织新旧代码 |
使用方便 |
只把最新版本声明为 inline ,用户直接用 ai::Xxx |
🎁 Bonus:和 #define
或 constexpr
配合版本判断
你还可以配合常量使用版本:
1 2 3 4 5
| namespace ai { inline namespace v2025_04 { constexpr int version = 202504; } }
|
然后在代码里:
1 2 3
| #if ai::version >= 202500 #endif
|