C# CLR 中學習 C++關(guān)鍵詞extern使用詳解
一:背景
在 CLR 源碼中有很多的 extern 和 extern "C" 這樣的關(guān)鍵詞,比如下面這些代碼:
extern size_t gc_global_mechanisms[MAX_GLOBAL_GC_MECHANISMS_COUNT];
extern DWORD g_dwHandles;
// The single GC heap instance, shared with the VM.
extern IGCHeapInternal* g_theGCHeap;
extern PTR_VOID GetUnwindDataBlob(TADDR moduleBase, PTR_RUNTIME_FUNCTION pRuntimeFunction, /* out */ SIZE_T * pSize);
extern "C" uint32_t* g_gc_card_table;
extern "C" uint8_t* g_gc_lowest_address;
extern "C"
{
uint8_t *g_gc_sw_ww_table = nullptr;
bool g_gc_sw_ww_enabled_for_gc_heap = false;
}
那這些都是什么意思呢? 為了更好的學習 CLR,這些還是要簡單了解一下的。
extern
1. 變量定義和變量引用
在 C# 中并沒有聽說過有 extern 這種概念,其實變量可以有兩種方式存在。
- 變量定義
- 變量引用
變量定義概念很簡單,定義就得給它分配內(nèi)存空間,比如下面這樣:
#include <iostream>
#include <Windows.h>
int k = 10;
const char* ch = "abcde";
int main()
{
printf("ch=%d", strlen(ch));
}
接下來看下 變量引用,它其實和 文件引用 以及 C# 的 using 概念相似,即把其他文件中的變量引入到本文件,目的就是為了使用,比如在 Arts 文件下定義了一個 page.cpp 文件,截圖如下:

為了能夠在 ConsoleApplication3.cpp 中使用 int i ,那怎么辦呢? 這時候就需要用 extern 引入了。

因為 VisualStudio 可以幫我們自動鏈接,所以這里就不需要 #include "page.cpp" 導入,接下來把程序跑起來,就可以觀察到程序的結(jié)果。

如果不用 extern 導入的話,就會出現(xiàn)編譯錯誤,說 n 是未定義的。

還有一點要注意 extern 是對外部變量的一個引用,它不會生成任何匯編代碼。
2. extern "C"
要理解這個關(guān)鍵詞,首先要明白 方法符號 的概念,因為 C 和 C++ 在給方法生成符號的邏輯是不一樣的,比如同樣的一個 fly 函數(shù)。
#include <stdio.h>
void fly() {
printf("hello world");
}
int main()
{
}
在 C 中生成的函數(shù)名還是 fly 字樣。

可 C++ 不這么認為,它會對 fly 函數(shù)名重新編排,比如下面的 ?fly@@YAXXZ。

如果你在 C++ 中混用 C 的話,這時候就有理念沖突,那在C++中讓某些函數(shù)名還是原樣生成有辦法嗎?當然可以了,這就需要使用 extern "C" ,參考如下代碼:
// page.cpp
#include <stdio.h>
extern "C"
{
void fly() {
printf("hello");
}
}
void fly2() {
printf("hello");
}
然后可以在 ConsoleApplication.cpp 中引入進來。
// ConsoleApplication.cpp
#include <iostream>
extern "C" void fly();
extern void fly2();
int main()
{
fly();
fly2();
return 0;
}

好了,本篇就簡單說這么多吧,相信再回頭看 CLR 中的那些 extern 關(guān)鍵詞,你會有一些新的理解。
以上就是C# CLR 中學習 C++關(guān)鍵詞extern使用詳解的詳細內(nèi)容,更多關(guān)于C# CLR學習C++ extern的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
C語言中常見的六種動態(tài)內(nèi)存錯誤總結(jié)
學習過C語言中的動態(tài)內(nèi)存函數(shù),例如【malloc】、【calloc】、【realloc】、【free】,那它們在使用的過程中會碰到哪些問題呢,本本文我們一起來探討下,感興趣的朋友跟著小編一起來看看吧2023-11-11
Ubuntu 20.04 下安裝配置 VScode 的 C/C++ 開發(fā)環(huán)境(圖文教程)
這篇文章主要介紹了Ubuntu 20.04 下安裝配置 VScode 的 C/C++ 開發(fā)環(huán)境,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-05-05

