位置: IT常识 - 正文

在 C# CLR 中学习 C++ 之了解 extern(c+c#)

编辑:rootadmin
一:背景 在 CLR 源码中有很多的 extern 和 extern "C" 这样的关键词,比如下面这些代码: extern size_t gc_global_mechanisms 一:背景

推荐整理分享在 C# CLR 中学习 C++ 之了解 extern(c+c#),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:c# cicd,learn c#,c# class program,cls c#,c#il,learn c#,c#中\r,learn c#,内容如对您有帮助,希望把文章链接给更多的朋友!

在 CLR 源码中有很多的 extern 和 extern "C" 这样的关键词,比如下面这些代码:

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,这些还是要简单了解一下的。

一:extern1. 变量定义和变量引用

在 C# 中并没有听说过有 extern 这种概念,其实变量可以有两种方式存在。

变量定义

变量引用

变量定义概念很简单,定义就得给它分配内存空间,比如下面这样:

#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 引入了。

在 C# CLR 中学习 C++ 之了解 extern(c+c#)

因为 VisualStudio 可以帮我们自动链接,所以这里就不需要 #include "page.cpp" 导入,接下来把程序跑起来,就可以观察到程序的结果。

如果不用 extern 导入的话,就会出现编译错误,说 n 是未定义的。

还有一点要注意 extern 是对外部变量的一个引用,它不会生成任何汇编代码。

2. extern "C"

要理解这个关键词,首先要明白 方法符号 的概念,因为 C 和 C++ 在给方法生成符号的逻辑是不一样的,比如同样的一个 fly 函数。

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

在 C 中生成的函数名还是 fly 字样。

可 C++ 不这么认为,它会对 fly 函数名重新编排,比如下面的 ?fly@@YAXXZ。

如果你在 C++ 中混用 C 的话,这时候就有理念冲突,那在C++中让某些函数名还是原样生成有办法吗?当然可以了,这就需要使用 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 关键词,你会有一些新的理解。

本文链接地址:https://www.jiuchutong.com/zhishi/304673.html 转载请保留说明!

上一篇:python中sys.argv模块的介绍(python中sys模块)

下一篇:mysql中regexp_instr函数的使用

  • 营业税金及附加包括哪些
  • 企业取得被投资单位的长期股权可以享有
  • 小规模纳税人免税会计分录
  • 财政补贴交不交印花税
  • 存款利息单需要缴纳个人所得税吗
  • 外贸公司代理出口退税怎么入账
  • 核定征收可以享受小微企业税收优惠吗
  • 企业支付给职工的工资和职工福利应当计入
  • 收到合同款
  • 营改增后广告行业税率
  • 出口贸易没有进口贸易
  • 公司如何向税务部门举报
  • 关于纳税人取得的发票
  • 涉税服务机构如何纳入监管平台
  • 增值税发票开票有误怎么办?
  • 2019年煤炭
  • 关于小规模纳税人
  • 税务局工会经费新举措
  • 开户存入现金计什么科目
  • 住房公积金个人缴费比例
  • 上年度所得税费用又退回来了,如何做账
  • 积分兑换现金消费的会计分录
  • 保护电脑安全的主要方式
  • 年末结转年初建账
  • 法人向公司借款要交什么税
  • 如何在 Windows 11 上打开 APK 文件
  • 发票开出后对方不付款
  • 银行提取现金会计等式
  • php使用memcache
  • 企业接受现金捐赠如何开具发票
  • 如何理解土地使用制度
  • 微信小程序实现支付功能
  • react错误处理
  • php用户登录界面代码
  • 对公账户走账是怎么回事
  • 工会会费收取
  • 员工工资计提
  • 运费计入什么会计分录
  • 资产减值损失如何计算
  • 委托加工的材料成本是否含增值税
  • 房地产卖房需要交契税吗现在
  • 营业执照丢失公告后几天可以办注销
  • 计提坏账准备资产总额会减少吗
  • 应收账款的账面价值是什么
  • 银行贷款直接给钱吗
  • 对公账户原路退回备注怎么写
  • 外贸企业面对人民币升值应该采取什么的避险措施
  • 每个月计提工资没有发怎么办
  • 兼职人员属于雇佣人吗
  • 购买公司分录怎么写
  • 销售回款率怎么计算,麻烦知道的告诉我,11
  • 投标保证金的计算
  • sqlserver 创建索引与使用
  • 下载windows vista
  • win7连接宽带
  • linux里find命令
  • windows无法完成配置若要尝试恢复配置
  • 备份ubuntu系统
  • linux添加启动
  • 怎么手动安装xp系统
  • win8玩游戏
  • linux如何使用gcc编译
  • android 相对布局居中
  • xtemplate node.js 的使用方法实例解析
  • dos命令/s
  • 实现原生的ajax
  • shell中数组如何定义
  • 微信小程序中显示app.json在项目根目录未找到怎么回事
  • unity3d模型怎么制作
  • unity gui教程
  • 深入浅出css
  • Python cx_freeze打包工具处理问题思路及解决办法
  • js tab页面切换
  • jquery实现点击按钮
  • java script入门
  • 简述python语言
  • 不用税控盘可以勾选发票吗
  • 运输服务费税率9%还是6%
  • 国外寄回来的奶粉被海关查到剪开,快递公司怎么处理
  • 一巩固三衔接
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设