日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
聊一聊C++中的namespace

?一、背景

相信大家在分析 dump 時(shí),經(jīng)常會(huì)看到 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

其實(shí)這就是命名空間,即 coreclr 在編譯源碼的時(shí)候,為 WKS? 和 SVR 各編譯了一份,不知道這么做的初衷是什么,這里就不管了,接下來看下 coreclr 中大概長啥樣子。

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

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

二、聊一聊 namespace

其實(shí)和 C# 的 namespace 本質(zhì)差不多,都是起到隔離的作用,而且和 using 的配合使用和 C# 也是如出一轍,太有意思了。

1. 簡單的隔離

在 C++ 中默認(rèn)只有一個(gè) namespace,所以相同的變量會(huì)出現(xiàn)沖突,解決辦法就是用 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);
}

當(dāng)然還可以嵌套使用,比如改成這樣。

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? 了, 不過這里有一個(gè)麻煩的地方,就是每次用 a 的時(shí)候都要輸入很長的前綴,那有沒有簡化的方法呢?當(dāng)然有啦。

2. 使用 using 導(dǎo)入?

接下來我們用 using 直接在 main 函數(shù)中定義字段,后續(xù)就不需要再寫長長的前綴引用了,參考代碼如下:

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 定義別名

定義別名這功能特別好,個(gè)人感覺已經(jīng)完全替代以前的 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 導(dǎo)入

這個(gè)是最普遍的,我們對系統(tǒng)庫的調(diào)用,無一不是用 using namespace 方式的,比如下面的代碼。

using namespace std;

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

接下來我們把 V1 導(dǎo)入到 main 方法中,這樣就可以自由自在的使用 WKS::V1 中的內(nèi)容了,參考如下代碼:

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

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

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

好了,這就是對 namespace 的一點(diǎn)理解,本篇就說這么多吧,希望對你有幫助。?


網(wǎng)頁名稱:聊一聊C++中的namespace
標(biāo)題網(wǎng)址:http://m.5511xx.com/article/cdheiig.html