快速笔记:inline namespace

有 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()
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";
}
}

// v1 不是 inline,保留兼容性但不默认使用
namespace v1 {
void hello() {
std::cout << "Hello from v1\n";
}
}
}

此时:

1
2
3
mylib::hello();       // 🔸 使用的是 v2 版本(因为是 inline)
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(); // ✅ 输出 tick v2025_04

旧代码还能写:

1
2
ai::v2023_12::Behavior old_b;
old_b.tick(); // ✅ 输出 tick v2023_12

🧠 实践建议

目的 怎么做
维护 ABI 给实现放进 inline namespace,防止链接冲突
版本演进 用多个 namespace vxxxx_xx 组织新旧代码
使用方便 只把最新版本声明为 inline,用户直接用 ai::Xxx

🎁 Bonus:和 #defineconstexpr 配合版本判断

你还可以配合常量使用版本:

1
2
3
4
5
namespace ai {
inline namespace v2025_04 {
constexpr int version = 202504;
}
}

然后在代码里:

1
2
3
#if ai::version >= 202500
// 使用新接口
#endif

------ 本文结束 ------
------ 版权声明:转载请注明出处 ------