iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C# CLR学习 C++使用namespace实例详解
  • 366
分享到

C# CLR学习 C++使用namespace实例详解

2024-04-02 19:04:59 366人浏览 薄情痞子
摘要

目录一:背景二:聊一聊 namespace1. 简单的隔离2. 使用 using 导入3. 使用 using 定义别名4. 使用 using namespace 导入一:背景 相信大

一:背景

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

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 在编译源码的时候,为 WKS 和 SVR 各编译了一份,不知道这么做的初衷是什么,这里就不管了,接下来看下 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 的一点理解,本篇就说这么多吧,希望对你有帮助。

以上就是C# CLR学习 C++使用namespace实例详解的详细内容,更多关于C# CLR C++使用namespace的资料请关注编程网其它相关文章!

--结束END--

本文标题: C# CLR学习 C++使用namespace实例详解

本文链接: https://www.lsjlt.com/news/166684.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C# CLR学习 C++使用namespace实例详解
    目录一:背景二:聊一聊 namespace1. 简单的隔离2. 使用 using 导入3. 使用 using 定义别名4. 使用 using namespace 导入一:背景 相信大...
    99+
    2024-04-02
  • C#CLR中学习C++关键词extern使用详解
    目录一:背景extern1. 变量定义和变量引用2. extern "C"一:背景 在 CLR 源码中有很多的 extern 和 e...
    99+
    2024-04-02
  • C++ namespace案例详解
    在C++语言编写的程序中,变量和函数等的作用范围是有一定限制的。比如,在函数体中定义的一个临时变量就不可以在函数体外使用。为了解决变量和函数等的作用范围,在C++语言中引入了名空间的...
    99+
    2024-04-02
  • C++学习之指针的使用详解
    C++中指针储存一个地址 声明: datatype* p;  datatype表示指针指向的数据类型。 int num=0; int* pnum=# //&...
    99+
    2023-03-02
    C++指针使用 C++指针
  • C++学习之多态的使用详解
    目录前言多态向上转型向下转型作用域前言 最近为了完成数据库系统的实验,又复习起了《C++ Primer》,上一次看这本巨著也是大二下的六月份,那时看面向对象程序编程这一章还云里雾里的...
    99+
    2024-04-02
  • C++指针学习详解
    目录指针的基本概念一、指针变量的定义和使用二、指针所占的空间内存1.空指针 野指针2. const修饰指针利用指针访问数组中的每个元素.总结指针的基本概念 指针的作用:可以通过指针间...
    99+
    2024-04-02
  • C++BoostHeap使用实例详解
    目录一、说明Boost.Heap二、功能示例一、说明Boost.Heap Boost.Heap 也可以称为 Boost.PriorityQueue,因为该库提供了几个优先级队列。但是...
    99+
    2022-11-13
    C++ Boost Heap C++ Boost Heap库函数
  • C++学习之线程详解
    目录开篇线程的状态多线程的构建计算时间一、程序运行时间二、chrono共享资源和互斥锁condition_variable线程池总结开篇 多线程是开发中必不可少的,往往我们需要多个任...
    99+
    2024-04-02
  • C++ com编程学习详解
    目录COM简介COM 规范首先创建一个ATL工程,创建后你会看到一个idl文件COM 原理学习ActiveX总结COM简介 COM全程为component object model ...
    99+
    2024-04-02
  • C++学习之算术运算符使用详解
    目录1. 前言2. 运算符种类3. 算术运算符3.1 功能描述3.2 运算符重载问题3.3 两数相除的问题3.4 关 于/和%运算符的正、负问题3.5 数据溢出问题3.6 类型转换3...
    99+
    2024-04-02
  • C++学习之函数模板的使用详解
    目录C++函数模板重载的模板模板局限性显示具体化实例化和具体化模板函数类型的确定C++函数模板 template<typename T> void Swap(T &...
    99+
    2023-03-02
    C++函数模板使用 C++函数模板 C++函数
  • C语言学习之指针的使用详解
    目录一、指针概念1.指针变量2.指针类型3.二级指针二、野指针1.野指针成因2.规避野指针三、指针运算1.指针±整数2.指针-指针3.指针关系运算四、指针数组1.指针和...
    99+
    2022-11-13
    C语言指针使用 C语言指针
  • C语言学习之标识符的使用详解
    目录命名规则命名规范示例代码总结C语言标识符是用于表示变量、函数、常量、类型等程序元素的名称。在 C语言中,标识符的命名规则和命名规范非常重要,它们直接影响到代码的可读性、可维护性和...
    99+
    2023-05-20
    C语言标识符用法 C语言标识符使用 C语言标识符
  • 示例详解C++语言中的命名空间 (namespace)
    目录前言1. 命名空间 2. using 指令 3. 不连续的命名空间 4. 嵌套的命名空间 5. 命名空间内变量、函数、全局变量的作用域5.1 using namespace fi...
    99+
    2024-04-02
  • C语言学习之关键字的示例详解
    目录1. 前言2. 什么是关键字3. extern-声明外部符号4. auto-自动5. typedef-类型重定义(类型重命名)6. register-寄存器6.1 存储器6.2 ...
    99+
    2022-11-13
    C语言 关键字
  • C语言学习之链表的实现详解
    目录一、链表的概念二、链表的结构三、顺序表和链表的区别和联系四、链表的实现一、链表的概念 链表是一种物理存储结构上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次...
    99+
    2022-11-13
    C语言 链表实现 C语言 链表
  • C++学习之命名空间详解
    目录1.命名空间的定义和使用2.命名空间嵌套3.命名空间别名4.标准命名空间总结C++中,命名空间(namespace)是一个重要的概念。命名空间可以为函数、变量、类等定义作用域,以...
    99+
    2023-05-18
    C++命名空间定义 C++命名空间使用 C++命名空间
  • C/C++中命名空间(namespace)详解及其作用介绍
    目录概述命名空间命名空间的作用自定义命名空间命名空间成员的方法案例概述 命名空间 (namespace) 可以帮助我们区分不同库中相同名称的函数, 类, 变量等. 使用了命名空间即定...
    99+
    2024-04-02
  • C++学习之异常机制详解
    目录1. 异常处理机制介绍2. 如何抛出异常和捕获异常2.1 抛出异常2.2 捕获异常3. 如何实现自己的异常4. 注意事项5. 面试常问的题目6. 答案7. 总结1. 异常处理机制...
    99+
    2023-05-15
    C++异常机制 C++异常
  • C# PropertyGrid使用案例详解
    1. 只有public的property能显示出来,可以通过BrowsableAttribute来控制是否显示,通过CategoryAttribute设置分类,通过Descripti...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作