日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學(xué)無先后,達(dá)者為師

網(wǎng)站首頁 編程語言 正文

C#?CLR?中學(xué)習(xí)?C++關(guān)鍵詞extern使用詳解_C 語言

作者:一線碼農(nóng) ? 更新時(shí)間: 2022-10-29 編程語言

一:背景

在 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;
}

那這些都是什么意思呢? 為了更好的學(xué)習(xí) CLR,這些還是要簡單了解一下的。

extern

1. 變量定義和變量引用

在 C# 中并沒有聽說過有?extern?這種概念,其實(shí)變量可以有兩種方式存在。

  • 變量定義
  • 變量引用

變量定義概念很簡單,定義就得給它分配內(nèi)存空間,比如下面這樣:

#include <iostream>
#include <Windows.h>
int k = 10;
const char* ch = "abcde";
int main()
{
	printf("ch=%d", strlen(ch));
}

接下來看下?變量引用,它其實(shí)和?文件引用?以及 C# 的?using?概念相似,即把其他文件中的變量引入到本文件,目的就是為了使用,比如在?Arts?文件下定義了一個(gè)?page.cpp?文件,截圖如下:

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

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

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

還有一點(diǎn)要注意?extern?是對外部變量的一個(gè)引用,它不會生成任何匯編代碼。

2. extern "C"

要理解這個(gè)關(guān)鍵詞,首先要明白?方法符號?的概念,因?yàn)?C 和 C++ 在給方法生成符號的邏輯是不一樣的,比如同樣的一個(gè)?fly?函數(shù)。

#include <stdio.h>
void fly() {
	printf("hello world");
}
int main()
{
}

在 C 中生成的函數(shù)名還是?fly?字樣。

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

如果你在 C++ 中混用 C 的話,這時(shí)候就有理念沖突,那在C++中讓某些函數(shù)名還是原樣生成有辦法嗎?當(dāng)然可以了,這就需要使用 extern "C"?,參考如下代碼:

// page.cpp
#include <stdio.h>
extern "C"
{
	void fly() {
		printf("hello");
	}
}
void fly2() {
	printf("hello");
}

然后可以在?ConsoleApplication.cpp?中引入進(jìn)來。

// ConsoleApplication.cpp
#include <iostream>
extern "C" void fly();
extern void fly2();
int main()
{
	fly();
	fly2();
	return 0;
}

好了,本篇就簡單說這么多吧,相信再回頭看 CLR 中的那些 extern 關(guān)鍵詞,你會有一些新的理解。

原文鏈接:https://www.cnblogs.com/huangxincheng/p/16649028.html

欄目分類
最近更新