成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

聊一聊 C++ 中的 namespace

開發 前端
在 C++ 中默認只有一個 namespace,所以相同的變量會出現沖突,解決辦法就是用 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 的一點理解,本篇就說這么多吧,希望對你有幫助。?

責任編輯:武曉燕 來源: 一線碼農聊技術
相關推薦

2023-10-12 09:58:45

操作符C++

2024-08-26 14:46:57

2020-10-30 07:11:31

C 語言編程

2020-12-11 11:11:44

原子類JavaCAS

2019-12-02 16:23:03

Python編程語言“垃圾”回收

2020-10-23 07:00:00

C++函數

2021-01-04 08:09:07

Linux內核Watchdog

2021-06-30 07:19:35

微服務業務MySQL

2020-09-08 06:54:29

Java Gradle語言

2019-12-12 14:52:10

數據庫腳本

2022-11-09 08:05:15

JavaScriptsuper()

2022-03-06 20:35:41

并發串行CAP

2024-10-16 15:11:58

消息隊列系統設計

2023-07-06 13:56:14

微軟Skype

2018-06-07 13:17:12

契約測試單元測試API測試

2021-01-28 22:31:33

分組密碼算法

2023-09-22 17:36:37

2020-05-22 08:16:07

PONGPONXG-PON

2021-12-06 09:43:01

鏈表節點函數

2023-09-20 23:01:03

Twitter算法
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 色黄爽| 国产视频1区 | 四虎最新视频 | 福利视频网址 | 亚洲综合视频 | 欧美午夜一区二区三区免费大片 | 伊人伊成久久人综合网站 | 免费视频一区二区 | 亚洲激情视频在线 | 精品一区二区三区电影 | 黄色一级在线播放 | 狠狠色狠狠色综合系列 | 欧美在线视频观看 | 久久久爽爽爽美女图片 | 国产高清视频在线观看 | 久久久蜜臀国产一区二区 | 国产成人免费视频网站高清观看视频 | 亚洲国产精品99久久久久久久久 | 国内精品久久精品 | 91麻豆精品国产91久久久更新资源速度超快 | 中文字幕精品一区二区三区精品 | 操操操操操 | 日韩毛片在线免费观看 | 国产欧美日韩一区 | 国产成人精品区一区二区不卡 | 精品免费国产 | 成人区精品一区二区婷婷 | 2019中文字幕视频 | 久久久高清 | 亚洲成人自拍网 | 日韩视频免费 | 亚洲天堂av一区 | 日韩午夜激情 | 密桃av| 免费在线观看一区二区三区 | 91综合网 | 99久久精品一区二区成人 | 亚洲国产成人精品女人久久久 | 成人在线一级片 | 91网站在线看 | 一区观看|