聊一聊 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.mzph.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;主要…

《看聊天记录都学不会Python到游戏实战?太菜了吧》(4)小白不知道这个知识点将会错漏百出

本系列文章将会以通俗易懂的对话方式进行教学&#xff0c;对话中将涵盖了新手在学习中的一般问题。此系列将会持续更新&#xff0c;包括别的语言以及实战都将使用对话的方式进行教学&#xff0c;基础编程语言教学适用于零基础小白&#xff0c;之后实战课程也将会逐步更新。 若…

【Pix4d精品教程】打开Pix4DMapper时提示Pix4DMapper.exe已停止工作的完全解决办法

本文为作者在使用软件时,打开Pix4DMapper时提示Pix4DMapper.exe已停止工作的完全解决办法,亲测可用! 目录 一、问题错误提示 二、问题分析及解决方法 一、问题错误提示 打开Pix4DMapper时,提示Pix4DMapper.exe已停止工作,错误提示如下: 展开问题详细信息:

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;使用它作为配置中心的可能性还是很大的…

看聊天记录都学不会C语言?太菜了吧》(17)5分钟搞懂指针与多重指针

若是大一学子或者是真心想学习刚入门的小伙伴可以私聊我&#xff0c;若你是真心学习可以送你书籍&#xff0c;指导你学习&#xff0c;给予你目标方向的学习路线&#xff0c;无套路&#xff0c;博客为证。 本系列文章将会以通俗易懂的对话方式进行教学&#xff0c;对话中将涵盖…

如何保护你的linux操作系统

导读在现在这个世道中&#xff0c;Linux操作系统的安全是十分重要的。但是&#xff0c;你得知道怎么干。一个简单反恶意程序软件是远远不够的&#xff0c;你需要采取其它措施来协同工作。那么试试下面这些手段吧。 使用SELinuxSELinux是用来对Linux进行安全加固的&#xff0c;有…

无人职守安装的设计与部署

无人职守安装的设计与部署 (2009-2-19) 安装前需要生成一个应答文件&#xff0c;此时需要一个光盘中的工具。首先&#xff0c;将WINDOWN2003光盘载入CD&#xff0c;---单击退出。接下来打开光盘&#xff0c; 选择SUPPORT—并打开&#xff0c; --TOOLS –并打开 -----…

干掉RedisHelper,请这样用分布式缓存

前言我们在项目中使用Redis时通常是写一个单例模式的RedisHelper静态类&#xff0c;暴露一些常用的Get、Set等操作&#xff0c;在需要使用地方直接RedisHelper.StringGet(xx,xx)就可以了&#xff0c;这样虽然简单粗暴地满足我们对Redis的所有操作需要&#xff0c;但是这在Asp.N…

《看聊天记录都学不会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…

国外设计师眼中的原型工具Mockplus

2019独角兽企业重金招聘Python工程师标准>>> 今天&#xff0c;我们评述一款新型设计工具&#xff0c;Mockplus&#xff0c;专为设计师而打造的创新性原型设计工具。Mockplus适合于各种应用软件的制作&#xff0c;无论是手机应用&#xff0c;网页应用&#xff0c;亦或…

《看聊天记录都学不会C#?太菜了吧》(1)从今天开始我是一个游戏开发者

本系列文章将会以通俗易懂的对话方式进行教学&#xff0c;对话中将涵盖了新手在学习中的一般问题。此系列将会持续更新&#xff0c;包括别的语言以及实战都将使用对话的方式进行教学&#xff0c;基础编程语言教学适用于零基础小白&#xff0c;之后实战课程也将会逐步更新。 若…

如何定制.NET6.0的日志记录

在本章中&#xff0c;也就是整个系列的第一部分将介绍如何定制日志记录(系列内容查阅《玩转ASP.NET 6.0框架-序言》)。默认日志记录仅写入控制台或调试窗口&#xff0c;这在大多数情况下都很好&#xff0c;但有时需要写入到文件或数据库&#xff0c;或者&#xff0c;您可能希望…

利用Erdas监督分类方法提取城镇用地信息完整实验操作步骤

打开erdas,分波段加载landsat TM 影像信息,并转成img图像格式文件。 1.打开erdas,点击viewer打开新窗口,点击打开图标,选择要加载的一个波段的tif图像,点击OK。 2.点击主窗口File——Save——Top Layer As…,在跳出的Save窗

通过Xshell上传下载文件

2019独角兽企业重金招聘Python工程师标准>>> 1&#xff09;安装模块 yum install lrzsz 2&#xff09;使用命令 rz #上传文件到Linux sz hello.txt #从Linux下载文件hello.txt 转载于:https://my.oschina.net/u/2351685/blog/519941

Centos 安装配置 vsftpd

为什么80%的码农都做不了架构师&#xff1f;>>> 一、安装vsftpd 执行 yum -y install vsftpd (rpm -qa|grep vsftpd 可查看是否已安装vsftpd, 默认配置文件在/etc/vsftpd/vsftpd/conf) 二、创建虚拟用户 选择在根目录或者用户目录下创建ftp文件夹&#xff1a;mkdir…