位置: 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函数的使用

  • 税务师补报名时间可以交费吗
  • 劳务公司计税税率
  • 制造业的税率是多少啊
  • 制造费用在借方表示什么
  • 发票抬头写错了还能改吗
  • 上个月工资没有发
  • 小规模纳税人印花税是季报还是月报
  • 股本与注册资本实收资本的区别
  • 计提增值税怎么计提
  • 应交税金及附加包括哪些
  • 已经入库的商品出库了要怎么做会计分录
  • 设备租赁公司购进设备怎么做账
  • 专用设备抵免企业所得税目录
  • 增值税普通发票可以抵扣进项税吗
  • 小规模纳税人每月15万免税
  • 住宅租给公司办什么手续
  • 资本收益率的计算公式净资产收益率
  • 固定资产对外投资增值税
  • 股东收回投资要交税吗
  • 代扣代缴境外增值税可以抵扣
  • 生产企业的免抵退纳税申报,在财务做销售收入账务后
  • 在win11
  • 支付职工培训费的现金流量项目
  • 债权人和债务人未经保证人同意变更
  • 公司装修费用如何入账
  • 王者荣耀中苏烈的最强出装
  • php删除数组中的某个值
  • macOS Big Sur 11.4 Beta 1(版本号20F5046g)正式发布
  • 银行发行债券要求
  • 原材料明细账有记税吗
  • 解决出现问题的人
  • mac phpstudy
  • php对二维数组进行排序
  • 印花税减半征收优惠政策2020
  • php 时间
  • 使用的拼音
  • hbuilderx安装教程视频
  • qt opencv ffmpeg
  • 结转生产成品
  • mssql使用教程
  • 长期股权投资资本公积增加记哪个会计科目
  • 小规模纳税人季度不超30万免增值税
  • 长期股权投资实现的净利润权益法
  • 本月盈利本年亏损要做分录吗
  • sqlserver2005简介
  • 购买火车票报销,实际没乘车能查到嘛
  • 测绘费 土地增值税
  • 新会计准则其他收益核算内容
  • 贸易公司委托加工费怎么入账
  • 主营业务收入的概念
  • 建筑设计行业收费标准
  • 企业房产税优惠政策2023
  • 生产线计提折旧是否会减少现金流
  • 购买专利后有占有权吗
  • 本年利润在借方表示什么意思
  • 服务业成本的会计核算
  • 不能收回的应收账款
  • 新成立的公司发朋友圈文案
  • 购买原材料材料尚未验收入库,款项尚未支付
  • windows2008r2修改密码
  • linux搭建socks代理
  • fedora vlc
  • macbook pro怎么分区
  • centos7光盘挂载方法
  • ubuntu with linux
  • win8开始屏幕设置
  • 优化linux系统的方法
  • win8全屏快捷键
  • 基于linux的mplayer音乐播放器
  • 无法装win7
  • win8 电话激活
  • linux克隆虚拟机
  • cocos2d游戏引擎
  • node.js中module.exports与exports用法上的区别
  • js的运算符
  • 关于numpy中loadtxt函数的说法
  • 简单的移动端项目
  • 天津国税电话
  • 如何查询公司的电话号码
  • 地税公职律师招聘
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设