🏠 1. namespace = 门牌号
代码里重名太多,namespace 就是给每个名字加个前缀来区分。
比如你的项目里有两个 android:
// 系统库里的原始 android
::android::ProcessState // 位置:全局 → android
// AIDL 自动生成的 android
aidl::android::hardware::testtld::IHelloTest // 位置:全局 → aidl → android → ...
都叫 android,但不在一个"家"里。
📌 2. using XXX = 给一个人发门禁卡
using aidl::android::hardware::testtld::IHelloTest;
效果:之后写 IHelloTest 就等于写 aidl::android::hardware::testtld::IHelloTest。
只给 这一个人 省掉了全名,其他人不受影响。
🏢 3. using namespace XXX = 给整个楼发门禁卡
using namespace aidl::android::hardware::testtld;
// ↑ 注意是 namespace,不是具体类名
效果:把 aidl::android::hardware::testtld 这个楼里所有人都请进来了。
之后你可以直接写:
IHelloTest // 不用前缀
HelloTest // 如果楼里还有别的类,也都能直接写
对比:
// using 单个名字 --- 只请一个人
using aidl::android::hardware::testtld::IHelloTest;
IHelloTest x; ✅
IHelloTest::HelloTest y; // ✅ 通过外层类名访问
HelloTest y; ❌ 还得写全名
// using namespace --- 请整个楼
using namespace aidl::android::hardware::testtld;
IHelloTest x; ✅
HelloTest y; ✅ 如果楼里有的话
危险在哪? 请的人多了,名字冲突的概率就高了。所以 using namespace std; 在很多项目里被禁用------它把 std 里几百个名字全倒进来了。
🔀 4. 冲突怎么来的
你写了:
using aidl::android::hardware::testtld::IHelloTest;
编译器记住了 aidl::android 这条路径。然后你写:
android::ProcessState
编译器优先顺着你 using 记下的路径去找 → aidl::android::ProcessState → 不存在 → 报错。
它不会自动跳回顶层的 ::android::ProcessState。
🔑 5. :: = 绝对路径
前面加 :: 就是"从顶层根目录开始,忽略所有 using":
::android::ProcessState // 无视 using,从全局根 → android → 找到了
类比文件路径:
android::ProcessState // 像相对路径:从当前位置找 → 跑偏了
::android::ProcessState // 像绝对路径:从 / 根目录找 → 稳定
📊 你的代码里实际发生了什么
#include <aidl/android/hardware/testtld/IHelloTest.h>
// 这个头文件里定义了:namespace aidl { namespace android { namespace hardware { namespace testtld { ... } } } }
using aidl::android::hardware::testtld::IHelloTest;
// compiler: 好的,我记住了 aidl::android 这条路
int main() {
::android::ProcessState::initWithDriver("/dev/vndbinder");
// ↑ 双冒号:别管 using,从全局根开始找 android → 找到系统库的 → ✅
std::shared_ptr<IHelloTest> service = ...
// ↑ 没写全名,compiler 查 using 列表 → 找到了 → ✅
AServiceManager_waitForService("android.hardware.testtld.IHelloTest/default")
// 这是字符串,不是 C++ 标识符,不受 namespace 影响 → ✅
}
🎯 一句话总结
| 概念 | 类比 | 写法 |
|---|---|---|
| namespace | 门牌号/文件夹路径 | aidl::android::hardware |
using XXX |
给一个人免写全名 | using aidl::...::IHelloTest; |
using namespace XXX |
给一栋楼所有人免写全名 | using namespace aidl::...; |
::XXX |
绝对路径,无视所有 using | ::android::ProcessState |