首页 > 编程语言 >在 C# CLR 中学习 C++ 之了解 namespace

在 C# CLR 中学习 C++ 之了解 namespace

时间:2022-09-01 12:12:39浏览次数:50  
标签:V1 C# namespace C++ int using WKS main

一:背景

相信大家在分析 dump 时,经常会看到 WKSSRV 这样的字眼,如下代码所示:


00007ffa`778a07b8 coreclr!WKS::gc_heap::segment_standby_list = 0x00000000`00000000
00007ffa`778a3870 coreclr!WKS::qpf = 0x989680
00007ffa`7789da30 coreclr!SVR::heap_select::numa_node_to_heap_map = unsigned short [1028]
00007ffa`7789f2d0 coreclr!SVR::gc_heap::should_expand_in_full_gc = 0n0

其实这就是命名空间,即 coreclr 在编译源码的时候,为 WKSSVR 各编译了一份,不知道这么做的初衷是什么,这里就不管了,接下来看下 coreclr 中大概长啥样子。


namespace WKS {
    #include "gcimpl.h"
    #include "gc.cpp"
}

namespace SVR {
    #include "gcimpl.h"
    #include "gc.cpp"
}

二:聊一聊 namespace

其实和 C# 的 namespace 本质差不多,都是起到隔离的作用,而且和 using 的配合使用和 C# 也是如出一辙,太有意思了。

1. 简单的隔离

在 C++ 中默认只有一个 namespace,所以相同的变量会出现冲突,解决办法就是用 namespace 隔离,参考如下代码:


namespace WKS
{
	int a = 10;
	int b = 11;
}

namespace SRV {

	int a = 100;
	int b = 101;
}

int main()
{
	printf("WKS::a= %d \n", WKS::a);
	printf("SRV::a= %d \n", SRV::a);
}

当然还可以嵌套使用,比如改成这样。


namespace WKS
{
	namespace V1 {
		int a = 10;
		int b = 11;
	}
}

int main()
{
	printf("WKS::a= %d \n", WKS::V1::a);
}

接下来看下汇编代码:

哈哈,看到上面的 WKS::V1::a 感觉是不是挺舒服的,也特能理解目前的 coreclr!WKS::xxx 了, 不过这里有一个麻烦的地方,就是每次用 a 的时候都要输入很长的前缀,那有没有简化的方法呢? 当然有啦。

2. 使用 using 导入

接下来我们用 using 直接在 main 函数中定义字段,后续就不需要再写长长的前缀引用了,参考代码如下:


namespace WKS
{
	namespace V1 {
		int a = 10;
		int b = 11;
	}
}

int main()
{
	using WKS::V1::a;

	printf("WKS::V1::a1= %d \n", a);
}

3. 使用 using 定义别名

定义别名这功能特别好,个人感觉已经完全替代以前的 typedef 功能,比如下面的代码是完全一样的。


int main()
{
	typedef const char* PCHAR;

	using PCHAR2 = const char*;

	PCHAR ptr1 = "hello world1";

	PCHAR2 ptr2 = "hello world2";
}

如果还不信的话,可以看下它们各自生成的汇编代码。


	PCHAR ptr1 = "hello world1";
00007FF79856183B  lea         rax,[string "hello world1" (07FF798569C10h)]  
00007FF798561842  mov         qword ptr [ptr1],rax  

	PCHAR2 ptr2 = "hello world2";
00007FF798561846  lea         rax,[string "hello world2" (07FF798569CE8h)]  
00007FF79856184D  mov         qword ptr [ptr2],rax  

4. 使用 using namespace 导入

这个是最普遍的,我们对系统库的调用,无一不是用 using namespace 方式的,比如下面的代码。


using namespace std;

int main()
{
	string str = "hello world";
}

接下来我们把 V1 导入到 main 方法中,这样就可以自由自在的使用 WKS::V1 中的内容了,参考如下代码:


namespace WKS
{
	namespace V1 {
		int a = 10;
		int b = 11;
	}
}

int main()
{
	using namespace WKS::V1;

	printf("a=%d, b=%d", a, b);
}

好了,这就是对 namespace 的一点理解,本篇就说这么多吧,希望对你有帮助。

标签:V1,C#,namespace,C++,int,using,WKS,main
From: https://www.cnblogs.com/huangxincheng/p/16646061.html

相关文章

  • ansible 002 连接被控端 inventory ansible.cfg ansible-adhoc ansible原理
    ssh用普通用户连接被控端配置主机清单(/etc/hosts域名解析为前提)[root@workstationansible]#cathostsserveraserverb[root@workstationansible]#pwd/etc/ans......
  • calc() 计算的宽度设置之后没有生效
    在计算的时候一定不要忘记加上单位,也不要忘记运算符之间要有空格。下面是错误的例子:.error{width:calc(var(--sidebar-width)-30);}下面是正确的例子:.correct{......
  • 【IO复用】epoll和select以及poll的区别
    select原理说在前面,整个select在内核空间中的工作事实上非常有趣,中间还会穿插一些可抢占点,检测当前是否有进程可以调度,增加系统的实时性初始化阶段:FD_set,把要监听的fd都......
  • LC238
    /*使用双指针,左指针指向当前已经处理好的序列的尾部,右指针指向待处理序列的头部。右指针不断向右移动,每次右指针指向非零数,则将左右指针对应的数交换,同时左指针右移。*/......
  • LC167
    vector<int>twoSum(vector<int>&nums,inttarget){intl=0;intr=nums.size()-1;vector<int>ans;while(l<r){if(nums[l]+nums[r]>targe......
  • HCNP Routing&Switching之DHCP安全
    前文我们了解了MAC地址防漂移技术,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/16632239.html;今天我们来了解下DHCP安全相关话题;回顾DHCP工作流程DHCP......
  • MVC单表二级联动
    今天学了MVC中单表二级联动,使用一个表单对其进行分级别查询一个是下拉框的二级联动一个是树状图类型的二级联动,树状图二级联动如果需要,后续可以将联动换为a标签,进行进一......
  • liunx系统docker部署.net core3.1
    此篇文章演示基本的基于docker部署.netcore服务,liunx系统腾讯云ubuntu,.netcore版本3.1。1.安装dockeraptinstalldocker.io2.拉取.netcore依赖镜像dockerpullm......
  • eclipse 快捷键
    1.生成变量名称:control+alt+L2.查看当前类被谁调用:control+h3.代码格式化control+shift+f (注意可能和windows繁体和简体输入法有冲突)4.debuge按钮和快捷键说明......
  • SAP 项目经理/FICO 顾问/ 权限顾问-广州外企需求 -WX lds1330
    公司属于外企新能源企业(工作地点广州市),目前市场增长强劲,需以下人员: ~~广州外企甲方SAP项目经理-5年以上,英语流利-有过外企或SAP项目管理经验,沟通能力好,熟悉制造行业后......