安卓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
相关推荐
朱涛的自习室7 小时前
70 美金的 Beyond Compare,我让 Gemini 4 和 DeepSeek 造个开源免费版(Day 2)
android·前端·人工智能
.Bryce.11 小时前
在智能体中使用A2A工具:让大模型自己决定“该找谁帮忙“
android·java·服务器·redis·后端·agent·a2a
方舟小孩12 小时前
开源办公软件海豹办公 1.9.15 实战 从模板异常到 Android WebView 资源回归
android
用户21816970493012 小时前
Kotlin 语法四 协程
android
出师牛12 小时前
Android - 再探Handler
android
高晶12 小时前
Android 物联网组网实战:NFC 从零到落地
android·java
stevenzqzq12 小时前
android 维度和渠道
android
古法安卓12 小时前
Android-SystemUI ANR协程相关问题排查
android·java·android studio
xiaogai_gai13 小时前
生产汇报单查询同步实战:从金蝶云星空拉取到轻易云数据集成平台的工程化做法
android
释厄62314 小时前
错误无误公理——错误正确本同源都迭代定律——逆转有价值
android·开发语言·kotlin