相关专栏【Linux专栏】【C语言专栏】【测试专栏】【MySQL专栏】【C 专栏】 相关文章推荐【测试】软件测试入门必看需求、开发模型、测试模型全解析【Linux】硬件架构系统软件冯诺依曼与操作系统深度剖析【Linux 】 网络基础必备常识1零基础快速吃透【Linux】玩转Socket快速掌握UDP数据传输很高兴你点开这篇文章✨这里会持续更新我喜欢的内容关注我一起慢慢变好呀 点赞 ⭐ 收藏 评论文章目录前言一、C的第一个程序二、从一个“冲突”问题开始三、域我们可以理解为C 的“隔离墙”四、namespace给名字一个“家”五、命名空间可以嵌套六、using namespace std 到底在干嘛他能够自动识别类型七、C vs C 输入输出八、本文全部代码前言C 命名空间与输入输出从“名字冲突”到“域隔离”你写的第一个 C 程序可能和我一样cout “hello world” endl;但为什么需要 using namespace stdnamespace 到底解决了什么问题 这篇文章带你用代码理解 C 的域与命名空间。 ✨ 一、C的第一个程序C兼容C语言绝大多数的语法所以C语言实现的 hello world 依旧可以运行C中需要把定义文件代码后缀改为.cppvs编译器看到是.cpp就会调用C编译器编译linux下要用g编译不再是gcc C ://test.cpp#includestdio.hintmain(){printf(hello world\n);return0;}当然C有⼀套⾃⼰的输⼊输出严格说C版本的hello world应该是这样写的。 C ://test.cpp#includeiostreamusingnamespacestd;intmain(){couthello worldendl;return0;} ✨ 二、从一个“冲突”问题开始C 允许我们定义变量、函数、结构体。但项目一大很容易出现同名冲突。比如#includestdlib.hintrand10;// 编译错误rand 已经是函数名因为 stdlib.h 里已经有一个 rand() 函数。C 中全局空间是共用的同名就会冲突。三、域我们可以理解为C 的“隔离墙” C 中的域分为四类域类型作用影响生命周期局部域{ } 内是全局域所有函数外部是命名空间域namespace 定义否类域class / struct 内部否 域的核心作用告诉编译器“去哪里找这个名字”。编译器默认查找规则不指定域时先局部域全局域inta11;// 全局intmain(){inta1;// 局部printf(%d\n,a);// 1局部优先printf(%d\n,::a);// 11:: 强制全局return0;}::叫做 域作用限定符有这个操作符的情况下系统的搜索逻辑就是访问全局优先左边不写 全局左边写名字 指定命名空间/类如Date::a四、namespace给名字一个“家” 基本用法namespaceCC{intrand10;intAdd(intleft,intright){returnleftright;}} 访问时printf(%d\n,CC::rand);// 10printf(%d\n,CC::Add(2,3)); 为什么 rand 不冲突了全局 rand 是函数CC::rand 是变量它们在不同的命名空间域编译器可以区分。五、命名空间可以嵌套namespaceCC{namespacedy{intrand1;}namespaceqe{intrand2;}}printf(%d\n,CC::dy::rand);// 1printf(%d\n,CC::qe::rand);// 2 适合大型项目的模块分层例如 公司::项目::模块六、using namespace std 到底在干嘛他能够自动识别类型C 标准库所有内容都在 std 命名空间中#includeiostream// 如果没有 using 或 std::cout hello; 就会错误// 方法1全量打开usingnamespacestd;// 方法2部分展开推荐usingstd::cout;usingstd::endl;// 方法3显式使用最安全std::coutistd::endl;不推荐随便 using namespace std 的原因一旦打开你写的 vector、sort 就可能与标准库冲突。公司/开源项目一般写 std::cout或在 .cpp 局部展开。七、CvsC输入输出功能CC输出printfstd::cout 输入scanfstd::cin 换行\nstd::endl 或 “\n”类型必须用格式化符自动识别类型安全较低格式错误较高编译时检查但不是绝对 示例doubles2.22222;printf(%.2f,s);// 2.22std::couts;// 2.22222不截断std::cinis;// 类似 scanfstd::coutii; cout / cin 优势无需记忆%d %f %p可连续链式输出性能略低于 printf ✨ 八、本文全部代码#define_CRT_SECURE_NO_WARNINGS1////初学C的第一个代码,它的头文件通常不带.h.如iostream.h是错的//#includeiostream//using namespace std; //std类似一个工具箱用这句代码意思就是工具箱打开里面的工具随你用//int main() //cout输出,endl换行,cin输入,string字符串,vector、map容器,sort算法...都是std里的工具//{// cout hello world endl; //cout-printfendl-换行符(\n)// return 0;//}//////////////////////////////////////////////////////////////////////////////////// C中域有函数局部域全局域命名空间域类域// //域影响的是编译时语法查找一个变量/函数/类型出处(声明或定义)的逻辑当有了域隔离名字冲突就解决了// //局部域和全局域除了会影响编译查找逻辑还会影响变量的生命周期命名空间域和类域不影响变量生命周期//接下来了解namespace////#includeiostream//#includestdlib.h//namespace CC//{// int rand 10; //rand 是个函数名stdlib.h里也一个rand// //当程序出现里另一个rand 时也就是这里的rand就会报错,用namespace就可以加以区分了// //放在cout里rand会被当成函数指针输出的是一串地址数字// int Add(int left, int right)// {// return left right;// }// struct Node// {// struct Node* next;// int val;// };//}//int a 11; //这里出现两个a系统会要那个呢// //系统的搜索逻辑在没有指定域的情况下就是先局部再全局所以第一个printf输出的值是1//int main()//{// int a 1;// printf(%d\n, a);// printf(%d\n, ::a); //::是域作用限定符有这个操作符的情况下系统的搜索逻辑就是访问全局优先// //::前面如果没有写其他东西就是全局访问如果有就是先访问该域如Date::a//// printf(%p\n, rand); //在coutprintf里rand是个函数指针打印出来的是地址数字所以用%p// printf(%d\n, CC::rand); //用来访问命名空间namespace里的rand输出结果就是10了//// printf(%p\n, CC::Add); //这里如果不指定即访问全局编译器就会报错因为Add在局部里// printf(%d\n,CC:: Add(2,3));//// return 0;//}////////////////////////////////////////////////////////////////////////////////////////////////////////namespace还可以嵌套////#includeiostream////namespace CC//{// //// namespace dy// {// int rand 1;// int Add(int left, int right)// {// return left right;// }// }// //// namespace qe// {// int rand 2;// int Add(int left, int right)// {// return left right;// }// }//}////int main()//{// printf(%d\n, CC::dy::rand);//1// printf(%d\n, CC::qe::rand);//2// return 0;//}//////////////////////////////////////////////////////////////////////////////////////////////////自动识别类型#includeiostream//using namespace std;//using std::cout;//using std::endl;intmain(){inti1;doubles2.22222;//cout i endl; //这里如果不加std::,他就会报错因为cout和endl是头文件iostream定义的全局对象//下面的cin也用不了std::coutistd::endl;;//要么在文件开头写上 using namespace std//他也可以部分展开using std::cout;// using std::endl;//为了避免我们定义的东西和库里面的冲突std::coutnihao mastd::endl;//会自动识别出空格符printf(%.2f,s);//保留两位小数std::cinis;//类似scanfstd::coutiistd::endl;std::coutssstd::endl;return0;} ✨ 小狗举爪爪求关注啦你的关注就是我更新的最大动力~ 点赞 ⭐ 收藏 评论