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

打印 上一主题 下一主题

主题 922|帖子 922|积分 2766

一:背景

在 CLR 源码中有很多的 extern 和 extern "C" 这样的关键词,比如下面这些代码:
  1. extern size_t gc_global_mechanisms[MAX_GLOBAL_GC_MECHANISMS_COUNT];
  2. extern DWORD g_dwHandles;
  3. // The single GC heap instance, shared with the VM.
  4. extern IGCHeapInternal* g_theGCHeap;
  5. extern PTR_VOID GetUnwindDataBlob(TADDR moduleBase, PTR_RUNTIME_FUNCTION pRuntimeFunction, /* out */ SIZE_T * pSize);
  6. extern "C" uint32_t* g_gc_card_table;
  7. extern "C" uint8_t* g_gc_lowest_address;
  8. extern "C"
  9. {
  10.     uint8_t *g_gc_sw_ww_table = nullptr;
  11.     bool g_gc_sw_ww_enabled_for_gc_heap = false;
  12. }
复制代码
那这些都是什么意思呢? 为了更好的学习 CLR,这些还是要简单了解一下的。
一:extern

1. 变量定义和变量引用

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

  • 变量定义
  • 变量引用
变量定义概念很简单,定义就得给它分配内存空间,比如下面这样:
  1. #include <iostream>
  2. #include <Windows.h>
  3. int k = 10;
  4. const char* ch = "abcde";
  5. int main()
  6. {
  7.         printf("ch=%d", strlen(ch));
  8. }
复制代码
接下来看下 变量引用,它其实和 文件引用 以及 C# 的 using 概念相似,即把其他文件中的变量引入到本文件,目的就是为了使用,比如在 Arts 文件下定义了一个 page.cpp 文件,截图如下:

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

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

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

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

要理解这个关键词,首先要明白 方法符号 的概念,因为 C 和 C++ 在给方法生成符号的逻辑是不一样的,比如同样的一个 fly 函数。
  1. #include <stdio.h>
  2. void fly() {
  3.         printf("hello world");
  4. }
  5. int main()
  6. {
  7. }
复制代码
在 C 中生成的函数名还是 fly 字样。

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

如果你在 C++ 中混用 C 的话,这时候就有理念冲突,那在C++中让某些函数名还是原样生成有办法吗?当然可以了,这就需要使用 extern "C" ,参考如下代码:
  1. // page.cpp
  2. #include <stdio.h>
  3. extern "C"
  4. {
  5.         void fly() {
  6.                 printf("hello");
  7.         }
  8. }
  9. void fly2() {
  10.         printf("hello");
  11. }
复制代码
然后可以在 ConsoleApplication.cpp 中引入进来。
  1. // ConsoleApplication.cpp
  2. #include <iostream>
  3. extern "C" void fly();
  4. extern void fly2();
  5. int main()
  6. {
  7.         fly();
  8.         fly2();
  9.         return 0;
  10. }
复制代码

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

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

北冰洋以北

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表