聊一聊 C++ 中的 namespace

网站建设4年前发布
29 0 0

相信大家在分析 dump 时,经常会看到 WKS​ 和 SRV 这样的字眼,如下代码所示:,其实这就是命名空间,即 coreclr 在编译源码的时候,为 WKS​ 和 SVR 各编译了一份,不知道这么做的初衷是什么,这里就不管了,接下来看下 coreclr 中大概长啥样子。,其实和 C# 的 namespace 本质差不多,都是起到隔离的作用,而且和 using 的配合使用和 C# 也是如出一辙,太有意思了。,1. 简单的隔离,在 C++ 中默认只有一个 namespace,所以相同的变量会出现冲突,解决办法就是用 namespace 隔离,参考如下代码:,202303061001562442ccb45f9d059d5465108d82f44591affe3f840,当然还可以嵌套使用,比如改成这样。,接下来看下汇编代码:,2023030610041296ec54943bd987736ae74460fde6fecfc3f701293,哈哈,看到上面的 WKS::V1::a​ 感觉是不是挺舒服的,也特能理解目前的 coreclr!WKS::xxx​ 了, 不过这里有一个麻烦的地方,就是每次用 a 的时候都要输入很长的前缀,那有没有简化的方法呢?当然有啦。,2. 使用 using 导入​,接下来我们用 using 直接在 main 函数中定义字段,后续就不需要再写长长的前缀引用了,参考代码如下:,20230306100412177aa303355f4020bf5989a8c7c12cc7f46616802,3. 使用 using 定义别名,定义别名这功能特别好,个人感觉已经完全替代以前的 typedef 功能,比如下面的代码是完全一样的。,如果还不信的话,可以看下它们各自生成的汇编代码。,4. 使用 using namespace 导入,这个是最普遍的,我们对系统库的调用,无一不是用 using namespace 方式的,比如下面的代码。,接下来我们把 V1 导入到 main 方法中,这样就可以自由自在的使用 WKS::V1 中的内容了,参考如下代码:,20230306100423017820756a5cc6f0d94949241d5f307b8bf39e922,好了,这就是对 namespace 的一点理解,本篇就说这么多吧,希望对你有帮助。​

© 版权声明

相关文章