安卓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
相关推荐
晓梦林5 小时前
cp520靶场学习笔记
android·笔记·学习
有味道的男人8 小时前
Open Claw对接1688平台
android·rxjava
_李小白9 小时前
【android opencv学习笔记】Day 17: 目标追踪(MeanShift)
android·opencv·学习
用户860225046747210 小时前
AI 分析头部APP系统优化框架
android
用户860225046747210 小时前
AI分析头部APP优化框架
android
2501_9160074712 小时前
iOS开发中抓取HTTPS请求的完整解决方法与步骤详解
android·网络协议·ios·小程序·https·uni-app·iphone
lvronglee15 小时前
【数字图传第四步】Android App查看图传视频
android·音视频
90后的晨仔15 小时前
Android 程序入口与核心组件详解
android
90后的晨仔15 小时前
Kotlin 简介与开发环境搭建
android
BU摆烂会噶16 小时前
【LangGraph】House_Agent 实战(四):预定流程 —— 中断与人工干预
android·人工智能·python·langchain