安卓HAL C++基础-命名域

🏠 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
相关推荐
诸神黄昏EX3 小时前
Android Google XTS
android
eSsO KERF3 小时前
MySQL Workbench菜单汉化为中文
android·数据库·mysql
pengyu5 小时前
【Kotlin 协程修仙录 · 筑基境 · 后阶】 | 调度器的艺术:Dispatchers 四大护法与 withContext 性能密码
android·kotlin
uElY ITER5 小时前
MySQL 中如何进行 SQL 调优
android·sql·mysql
xxjj998a5 小时前
Laravel3.x:奠定现代PHP框架的重要里程碑
android·开发语言·php
Yang-Never6 小时前
Git -> Git Worktree 工作树
android·开发语言·git·android studio
xingpanvip6 小时前
星盘接口开发文档:日运语料接口指南
android·开发语言·前端·css·php·lua
计算机安禾7 小时前
【Linux从入门到精通】第42篇:深入理解Linux内存管理
android·linux·运维
XD7429716367 小时前
科技早报晚报|2026年5月1日:本地优先文档、安卓离线 IDE 与双击即用密码库,今天最值得跟进的 3 个机会
android·ide·科技·科技新闻·开发者工具·本地优先