聊一聊 CLR 中的 typedef 是怎么玩的

一:背景

在 CLR 源碼中,我們會看到很多關于 typedef 的定義,比如下面這樣:

//?Callback?function?type?used?by?DacStreamManager?to?coordinate
//?amount?of?available?memory?between?multiple?streamable?data
//?structures?(e.g.?DacEENamesStreamable)
typedef?bool?(*Reserve_Fnptr)(DWORD?size,?void?*?writeState);typedef?BOOL?(*NTQUERYSYSTEMINFORMATION)(SYSTEM_INFORMATION_CLASS?SystemInformationClass,PVOID?SystemInformation,ULONG?SystemInformationLength,PULONG?ReturnLength);typedef?struct?_HashInstanceKey?{TADDR?addr;DAC_INSTANCE*?instance;
}?HashInstanceKey;typedef?TokenHashMap<EEClass>?EEClassToTypeRefMap;
typedef?TokenHashMap<MethodTable>?MTToTypeRefMap;

如果你不了解 C 的話又是一陣頭暈,那 typedef 到底能給我們帶來什么好處呢?直白的說,它可以給某一些類型定義別名,比如結構體,變量,函數指針 等等,類型越復雜好處越大,接下來我們舉兩個例子說明一下。

二:typedef 的簡單用法

  1. 使用 typedef 定義函數指針

在不用 typedef 的前提下,我們看看原生方式的 函數指針 有多么復雜,參考代碼如下:

#include?<iostream>//函數指針
int?(*ptrAddFunc)(int?a,?int?b);int?Add(int?a,?int?b)?{?return?a?+?b;?}int?main()
{int?(*ptrAddFunc1)(int?a,?int?b)?=?Add;int?(*ptrAddFunc2)(int?a,?int?b)?=?Add;int?sum1?=?ptrAddFunc1(10,?20);int?sum2?=?ptrAddFunc1(100,?200);printf("sum1=%d,?sum2=%d",?sum1,?sum2);
}

如果用 typedef 來統一替換別名會怎么樣呢?試一試就知道了哈,參考代碼如下:

#include?<iostream>//函數指針
typedef?int?(*ptrAddFunc)(int?a,?int?b);int?Add(int?a,?int?b)?{?return?a?+?b;?}int?main()
{ptrAddFunc?func1?=?Add;ptrAddFunc?func2?=?Add;int?sum1?=?func1(10,?20);int?sum2?=?func2(100,?200);printf("sum1=%d,?sum2=%d",?sum1,?sum2);
}

是不是找到了寫 C# 的感覺了哈,太方便了。

  1. 建立一套自己的類型系統

熟悉 C# 的朋友應該了解其有一套基元類型如:Int32, Int64,Float, Double,那如何將它帶到 C 的環境下呢?這就需要用 typedef 啦,參考如下代碼:

#include?<iostream>typedef?long?long?Int64;
typedef?int?Int32;
typedef?float?Float;
typedef?double?Double;int?Add(int?a,?int?b)?{?return?a?+?b;?}int?main()
{Int32?i32?=?10;Int64?i64?=?11;size_t?s1?=?sizeof(Int32);size_t?s2?=?sizeof(Int64);printf("output:sizeof_int=%zu,sizeof_long=%zu,i32=%d,i64=%d",?s1,?s2,?i32,?i64);
}output:sizeof_int=4,sizeof_long=8,i32=10,i64=11

三:typedef 和 define 的區別

仔細想想,其實它們基因是不同的,一個是占位符,一個是取別名,兩個不同用途的東西自然就會在多個場景下有著不一樣的展示, 比如在指針上就有區別。

#include?<iostream>#define?ptr1?char*
typedef?char*?ptr2;int?main()
{ptr1?p1,?p2;ptr2?p10,?p20;printf("output:?p1=%zu,?p2=%zu,p10=%zu,?p20=%zu",?sizeof(p1),sizeof(p2),sizeof(p10),sizeof(p20));
}output:?p1=4,?p2=1,p10=4,?p20=4

從size大小可判斷,4 表示一個32bit的指針單元,那 1 是什么東西呢?我們截圖看一下:

01fec228c25e2b46620582859bcb429a.png

可以看出它是一個 char 類型,這就是它們倆不一樣,當然這是編譯器層面做出的選擇,大體上就聊這么多吧,希望對你有幫助。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/287267.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/287267.shtml
英文地址,請注明出處:http://en.pswp.cn/news/287267.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

JAVA如何正確處理Unicode字符

最近在開發輸入法程序時遇到一個小問題&#xff0c;就是刪除一個emoji時&#xff0c;不能一次刪干凈&#xff0c;需要執行兩次操作才可以。Intuitively&#xff0c;這肯定是java操作unicode字符的問題&#xff0c;于是找了JAVA官方文檔參考一下&#xff0c;解決了這個問題&…

透過面試題,洞察Hbase 核心知識點

LSM 算法 HFile 索引 &#xff0c;二級索引 hbase的問題 1.hbase怎么預分區&#xff1f; 2.hbase怎么給web前臺提供接口來訪問&#xff1f; 3.htable API有沒有線程安全問題&#xff0c;在程序中是單例還是多例&#xff1f; 4.我們的hbase大概在公司業務中&#xff08;主要…

Android之解決android9.0通過Inten方式卸載APP沒反應

1 問題 通過Intent卸載APP在安卓9.0手機上沒反應&#xff0c;也沒報錯&#xff0c;卸載相關APP跳轉到卸載頁面代碼 fun unInstallApp(packageName: String) {val uri: Uri Uri.fromParts("package", packageName, null)val intent Intent(Intent.ACTION_DELETE, u…

《看聊天記錄都學不會Python到游戲實戰?太菜了吧》(4)小白不知道這個知識點將會錯漏百出

本系列文章將會以通俗易懂的對話方式進行教學&#xff0c;對話中將涵蓋了新手在學習中的一般問題。此系列將會持續更新&#xff0c;包括別的語言以及實戰都將使用對話的方式進行教學&#xff0c;基礎編程語言教學適用于零基礎小白&#xff0c;之后實戰課程也將會逐步更新。 若…

【Pix4d精品教程】打開Pix4DMapper時提示Pix4DMapper.exe已停止工作的完全解決辦法

本文為作者在使用軟件時,打開Pix4DMapper時提示Pix4DMapper.exe已停止工作的完全解決辦法,親測可用! 目錄 一、問題錯誤提示 二、問題分析及解決方法 一、問題錯誤提示 打開Pix4DMapper時,提示Pix4DMapper.exe已停止工作,錯誤提示如下: 展開問題詳細信息:

oracle 導庫時日志滿了,oracle rac 11g 日志占滿系統盤導致數據庫down掉

oracle日志占滿系統盤滿了導致數據庫掛掉 并且archivelog日志也滿了倒是數據庫無法open&#xff0c;無法登陸&#xff0c;幸好還可以到mount狀態。解決辦法&#xff1a;1.根據報錯查看 表象&#xff1a; crs 服務down掉CRS-0184: Cannot communicate with the CRS daemon刪除/v…

Framework Design Studio 發布了

介紹 Krzysztof Cwalina 和他的伙計們最近在開發一個工具&#xff0c;可以幫助框架設計者更容易地進行設計、復查和維護高度易用的API&#xff0c;你可一定要看看Framework Design Studio&#xff08;FDS&#xff09;。 可以在此處下載FDS和它的快速入門文檔。 目前這個工具主要…

微服務 配置中心 Nacos .Net 5

本文來自投稿&#xff1a;藍創精英團隊基于Nacos來一篇關于微服務的配置中心方案Demo。Nacos是開源的&#xff0c;同時&#xff0c;阿里云也有收費的關于它的服務&#xff0c;公司剛好是依托阿里云的服務體系&#xff0c;所以&#xff0c;使用它作為配置中心的可能性還是很大的…

【Pix4d精品教程】安裝Pix4Dmapper時提示“無法啟動此程序,因為計算機中丟失api-ms-win-crt-runtime-l1-1-0.dll”完全解決辦法

Pix4Dmapper系列文章合集: 打開Pix4DMapper時提示Pix4DMapper.exe已停止工作的完全解決辦法 Pix4DMapper圖文安裝教程(附安裝包下載) Pix4Dmapper完整航測內業操作流程手把手圖文教程 目 錄 一、問題描述 二、問題分析 三、解決辦法

看聊天記錄都學不會C語言?太菜了吧》(17)5分鐘搞懂指針與多重指針

若是大一學子或者是真心想學習剛入門的小伙伴可以私聊我&#xff0c;若你是真心學習可以送你書籍&#xff0c;指導你學習&#xff0c;給予你目標方向的學習路線&#xff0c;無套路&#xff0c;博客為證。 本系列文章將會以通俗易懂的對話方式進行教學&#xff0c;對話中將涵蓋…

如何保護你的linux操作系統

導讀在現在這個世道中&#xff0c;Linux操作系統的安全是十分重要的。但是&#xff0c;你得知道怎么干。一個簡單反惡意程序軟件是遠遠不夠的&#xff0c;你需要采取其它措施來協同工作。那么試試下面這些手段吧。 使用SELinuxSELinux是用來對Linux進行安全加固的&#xff0c;有…

Android之使用ACTION_USAGE_ACCESS_SETTINGS權限檢測手機多少天沒有未使用其它APP

1 需求 找出手機多少天沒有使用的所有APP 2 思路 通過 ACTION_USAGE_ACCESS_SETTINGS權限得到多少天已經使用的APP的包名,然后獲取手機所有用戶APP,剩下的APP就是多少天沒有使用的APP。 3 ACTION_USAGE_ACCESS_SETTINGS權限申請 1)在AndroidManifest.xml文件里面定義權限…

無人職守安裝的設計與部署

無人職守安裝的設計與部署 (2009-2-19) 安裝前需要生成一個應答文件&#xff0c;此時需要一個光盤中的工具。首先&#xff0c;將WINDOWN2003光盤載入CD&#xff0c;---單擊退出。接下來打開光盤&#xff0c; 選擇SUPPORT—并打開&#xff0c; --TOOLS –并打開 -----…

【Pix4d精品教程】Pix4dmapper航測內業項目化數據處理完整流程(空三、生成點云、DOM和DSM)

Pix4dmapper是一款集全自動、快速、專業精度為一體的無人機數據和航空影像數據處理軟件。無需專業知識,無需人工干預,即可將數千張影像快速制作成專業的、精確的二維地圖和三維模型。 本文講解采用Pix4dmapper攝影測量內業數據處理完整流程,主要步驟包括:新建項目、添加影像…

干掉RedisHelper,請這樣用分布式緩存

前言我們在項目中使用Redis時通常是寫一個單例模式的RedisHelper靜態類&#xff0c;暴露一些常用的Get、Set等操作&#xff0c;在需要使用地方直接RedisHelper.StringGet(xx,xx)就可以了&#xff0c;這樣雖然簡單粗暴地滿足我們對Redis的所有操作需要&#xff0c;但是這在Asp.N…

4個常用的awk統計命令

1、求和cat data|awk {sum$1} END {print "Sum ", sum}2、求平均cat data|awk {sum$1} END {print "Average ", sum/NR}3、求最大值cat data|awk BEGIN {max 0} {if ($1>max) max$1 fi} END {print "Max", max}4、求最小值&#xff08;min…

《看聊天記錄都學不會C#?太菜了吧》(2)C#那么簡單我為何之前還學C語言?

本系列文章將會以通俗易懂的對話方式進行教學&#xff0c;對話中將涵蓋了新手在學習中的一般問題。此系列將會持續更新&#xff0c;包括別的語言以及實戰都將使用對話的方式進行教學&#xff0c;基礎編程語言教學適用于零基礎小白&#xff0c;之后實戰課程也將會逐步更新。 若…

Android之java.lang.ClassCastException: *****cannot be cast to*******

1 問題 在寫BaseMultiItemQuickAdapter適配器的時候&#xff0c;更具不同類型構建不同的實體對象&#xff0c;提示錯誤如下 2 原因 Overrideprotected void convert(BaseViewHolder helper, MultiItemEntity item) {switch (helper.getItemViewType()) {case AppCleanHead.app…

php函數的初步使用

通過調用函數&#xff0c;實現打印半金字塔、全金字塔、空心金字塔、菱形、空心菱形 調用例程 huaTuMain.php被調用函數 huaTu.php轉載于:https://www.cnblogs.com/seaBiscuit0922/p/5613141.html

ORACLE 11G DATA GUARD主從切換

當oracle data guard中如主庫出現當機時,需要將從庫切換為主庫,以下從實驗環境模擬主從庫切換操作:1.查看主從庫角色192.168.88.120:192.168.88.119:2.將主庫(88.120)切換為從庫alter database commit to switchover to physical standby with sessionB shutdown;shutdown im…