網(wǎng)站首頁 編程語言 正文
一:背景
在 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
相關(guān)推薦
- 2021-12-12 C/C++?Qt?MdiArea?多窗體組件應(yīng)用教程_C 語言
- 2022-08-29 Python+SeaTable實(shí)現(xiàn)計(jì)算兩個(gè)日期間的工作日天數(shù)_python
- 2022-09-01 ASP.NET輕量級MVC框架Nancy的基本用法_實(shí)用技巧
- 2023-11-15 linux查看目錄的大小,指定目錄查看所占的空間大小
- 2022-01-23 SpringBoot時(shí)區(qū)問題解決,徹底解決時(shí)差問題
- 2023-02-17 Python運(yùn)算符優(yōu)先級詳細(xì)整理_python
- 2022-09-08 go語言數(shù)據(jù)類型之字符串string_Golang
- 2023-01-08 Go設(shè)計(jì)模式原型模式考查點(diǎn)及使用詳解_Golang
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支