)
C 命名空间Namespace一、什么是命名空间为什么要用命名空间 给代码 “加个文件夹 / 标签”作用解决名字冲突让不同地方的同名函数、变量、类可以共存不打架。比如你写了一个print()别人的库也有一个print()编译器会懵到底用哪个用命名空间分开就不会冲突了。二、基础语法1. 定义命名空间namespace 名字 { // 变量、函数、类都可以放这里 }2. 使用命名空间里的内容有 3 种用法从推荐到不推荐指定全名最安全命名空间::成员using 声明using 命名空间::成员;using 编译指令using namespace 命名空间;容易冲突少用三、完整代码 逐行讲解示例 1最基础用法定义 使用#include iostream using namespace std; // 先暂时用标准库命名空间方便输出 // 定义一个命名空间mySpace namespace mySpace { // 命名空间里的变量 int num 100; // 命名空间里的函数 void show() { cout 我在 mySpace 里num num endl; } } // 主函数 int main() { // 用法1使用 命名空间::成员 最推荐 mySpace::show(); // 修改变量 mySpace::num 200; cout 修改后 mySpace::num endl; return 0; }运行结果我在 mySpace 里num 100 修改后200关键点::叫作用域解析符意思是 “用这个命名空间里的东西”。这种写法绝对不会冲突大型项目首选。示例 2名字冲突命名空间的核心用途这是命名空间最有用的场景#include iostream using namespace std; // 第一个命名空间 namespace A { void print() { cout 我是 A 空间的 print endl; } } // 第二个命名空间同名函数 namespace B { void print() { cout 我是 B 空间的 print endl; } } int main() { // 分别调用完全不冲突 A::print(); B::print(); return 0; }运行结果我是 A 空间的 print 我是 B 空间的 print结论只要放在不同命名空间同名函数 / 变量完全没问题。示例 3using 声明只导入一个成员#include iostream using namespace std; namespace myMath { int add(int a, int b) { return a b; } } // 只导入 myMath 里的 add 函数 using myMath::add; int main() { // 直接用 add不用写 myMath:: cout add(3, 5) endl; return 0; }优点只导入需要的比全导入安全。示例 4using namespace全部导入#include iostream using namespace std; // 导入标准库所有内容 namespace demo { void test() { cout test() endl; } } // 一次性导入 demo 所有内容 using namespace demo; int main() { test(); // 直接用 return 0; }⚠️警告using namespace 命名空间;小代码可以用大型项目尽量别用容易引发名字冲突四、进阶知识点面试常考1. 命名空间可以嵌套namespace outer { int a 10; namespace inner { int b 20; void show() { cout a b endl; } } } // 使用 outer::inner::show();2. 命名空间是开放的可以分段写同一个命名空间可以写在多个地方编译器会自动合并namespace ns { int x 1; } namespace ns { int y 2; } // 最终 ns 里有 x 和 y3. 匿名命名空间内部专用没有名字的空间只能在当前文件使用类似 staticnamespace { int secret 999; } // 直接用 secret别的文件访问不到4. 标准库都在 std 命名空间里你写的cout hello;真实面目std::cout hello;所以写using namespace std;就是为了偷懒少写std::五、最佳实践一定要记住项目里永远优先用命名空间::成员头文件里绝对不要写using namespace std;大型项目禁止随便用using namespace自己写库、模块时一定要用命名空间包裹六、总结命名空间 防止名字冲突核心符号::作用域解析符三种用法空间::成员最安全using 空间::成员;导入单个using namespace 空间;全部导入少用标准库都在std里