1987WEB视界-分享互联网热门产品和行业

您现在的位置是:首页 > WEB开发 > 正文

WEB开发

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

1987web2024-03-26WEB开发209
一:背景在CLR源码中有很多的extern和extern"C"这样的关键词,比如下面这些代码:externsize_tgc_global_mechan

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

一:背景

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

externsize_tgc_global_mechanisms[MAX_GLOBAL_GC_MECHANISMS_COUNT];externDWORD g_dwHandles;// The single GC heap instance, shared with the VM.externIGCHeapInternal*g_theGCHeap;externPTR_VOIDGetUnwindDataBlob(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;boolg_gc_sw_ww_enabled_for_gc_heap=false;}

那这些都是什么意思呢? 为了更好的学习 CLR,这些还是要简单了解一下的。

一:extern

1. 变量定义和变量引用

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

变量定义

变量引用

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

#include#includeintk=10;constchar*ch="abcde";intmain(){printf("ch=%d",strlen(ch));}

接下来看下变量引用,它其实和文件引用以及 C# 的using概念相似,即把其他文件中的变量引入到本文件,目的就是为了使用,比如在Arts文件下定义了一个page.cpp文件,截图如下:

为了能够在ConsoleApplication3.cpp中使用int i,那怎么办呢? 这时候就需要用 extern 引入了。

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

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

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

2. extern "C"

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

#includevoidfly(){printf("hello world");}intmain(){}

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

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

如果你在 C++ 中混用 C 的话,这时候就有理念冲突,那在C++中让某些函数名还是原样生成有办法吗?当然可以了,这就需要使用extern "C",参考如下代码:

// page.cpp#includeextern"C"{voidfly(){printf("hello");}}voidfly2(){printf("hello");}

然后可以在ConsoleApplication.cpp中引入进来。

// ConsoleApplication.cpp#includeextern"C"voidfly();externvoidfly2();intmain(){fly();fly2();return0;}

好了,本篇就简单说这么多吧,相信再回头看 CLR 中的那些 extern 关键词,你会有一些新的理解。

声明:本站所有文章,如无特殊说明或标注,均为爬虫抓取以及网友投稿,版权归原作者所有。