C#?CLR學(xué)習(xí)?C++使用namespace實例詳解
一:背景
相信大家在分析 dump 時,經(jīng)常會看到 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 本質(zhì)差不多,都是起到隔離的作用,而且和 using 的配合使用和 C# 也是如出一轍,太有意思了。
1. 簡單的隔離
在 C++ 中默認只有一個 namespace,所以相同的變量會出現(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
了, 不過這里有一個麻煩的地方,就是每次用 a
的時候都要輸入很長的前綴,那有沒有簡化的方法呢? 當(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 定義別名
定義別名這功能特別好,個人感覺已經(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)入
這個是最普遍的,我們對系統(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 的一點理解,本篇就說這么多吧,希望對你有幫助。
以上就是C# CLR學(xué)習(xí) C++使用namespace實例詳解的詳細內(nèi)容,更多關(guān)于C# CLR C++使用namespace的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
C語言的isatty函數(shù)和ttyname函數(shù)以及sendmsg函數(shù)用法
這篇文章主要介紹了C語言的isatty函數(shù)和ttyname函數(shù)以及sendmsg函數(shù)用法,是C語言入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下2015-09-09Matlab利用隨機森林(RF)算法實現(xiàn)回歸預(yù)測詳解
這篇文章主要為大家詳細介紹了Matlab如何利用隨機森林(RF)算法實現(xiàn)回歸預(yù)測,以及自變量重要性排序的操作,感興趣的小伙伴可以了解一下2023-02-02深入解析C++的WNDCLASS結(jié)構(gòu)體及其在Windows中的應(yīng)用
這篇文章主要介紹了C++的WNDCLASS結(jié)構(gòu)體及其在Windows中的應(yīng)用,WNDCLASS被用來定義窗口,文中介紹了其諸多屬性,需要的朋友可以參考下2016-01-01Visual?Studio2022下Opencv的配置圖文教程
本文主要介紹了Visual?Studio2022下Opencv的配置圖文教程,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-07-07C語言 不使用strcat函數(shù)實現(xiàn)連接兩個字符串功能代碼
今天小編就為大家分享一篇C語言 不使用strcat函數(shù)實現(xiàn)連接兩個字符串功能代碼,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-12-12簡要對比C語言中的dup()函數(shù)和dup2()函數(shù)
這篇文章主要介紹了簡要對比C語言中的dup()函數(shù)和dup2()函數(shù),是C語言入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下2015-08-08C語言數(shù)據(jù)結(jié)構(gòu)中數(shù)制轉(zhuǎn)換實例代碼
這篇文章主要介紹了C語言數(shù)據(jù)結(jié)構(gòu)中數(shù)制轉(zhuǎn)換實例代碼的相關(guān)資料,需要的朋友可以參考下2017-03-03C++ Boost MetaStateMachine定義狀態(tài)機超詳細講解
Boost是為C++語言標(biāo)準(zhǔn)庫提供擴展的一些C++程序庫的總稱。Boost庫是一個可移植、提供源代碼的C++庫,作為標(biāo)準(zhǔn)庫的后備,是C++標(biāo)準(zhǔn)化進程的開發(fā)引擎之一,是為C++語言標(biāo)準(zhǔn)庫提供擴展的一些C++程序庫的總稱2022-12-12