首页IT科技excite词源(在 C# CLR 中学习 C++ 之了解 extern)

excite词源(在 C# CLR 中学习 C++ 之了解 extern)

时间2025-06-14 01:48:19分类IT科技浏览4499
导读:一:背景 在 CLR 源码中有很多的 extern 和 extern "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                  ,这些还是要简单了解一下的            。

一:extern

1. 变量定义和变量引用

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

因为 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 关键词,你会有一些新的理解                  。

创心域SEO版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!

展开全文READ MORE
网站内部如何优化(网站应该怎么优化) 遭受网站攻击,怎么办?(应对网站攻击的必备措施)