C# CLR 中学习 C++关键词extern使用详解

 更新时间:2022年09月02日 10:59:22   作者:一线码农  
这篇文章主要为大家介绍了C# CLR 中学习 C++ 之extern使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

一:背景

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

以上就是C# CLR 中学习 C++关键词extern使用详解的详细内容,更多关于C# CLR学习C++ extern的资料请关注脚本之家其它相关文章!

相关文章

  • C++ 随机数与随机种子数的实例

    C++ 随机数与随机种子数的实例

    这篇文章主要介绍了C++ 随机数与随机种子数的实例的相关资料,需要的朋友可以参考下
    2017-07-07
  • C++非递归遍历磁盘文件和递归遍历磁盘文件的程序示例

    C++非递归遍历磁盘文件和递归遍历磁盘文件的程序示例

    这篇文章主要介绍了C++非递归遍历磁盘文件和递归遍历磁盘文件的程序示例,大家可以参考使用二种方法
    2013-11-11
  • linux c++ 服务器端开发面试必看书籍整理

    linux c++ 服务器端开发面试必看书籍整理

    这篇文章主要介绍了linux c++ 服务器端开发面试必看书籍整理,需要的朋友可以参考下
    2020-02-02
  • C语言巧用二分查找实现猜数游戏

    C语言巧用二分查找实现猜数游戏

    二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法。但是,折半查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列,本篇文章教你用二分查找编写猜数字游戏
    2022-02-02
  • C++ STL 四种智能指针的用法详解

    C++ STL 四种智能指针的用法详解

    C++ 标准模板库 STL(Standard Template Library) 一共给我们提供了四种智能指针:auto_ptr、unique_ptr、shared_ptr 和 weak_ptr,今天给大家详细介绍这几种指针的具体用法,需要的朋友参考下吧
    2021-06-06
  • C++深入探究引用的使用

    C++深入探究引用的使用

    引用是C++一个很重要的特性,顾名思义是某一个变量或对象的别名,对引用的操作与对其所绑定的变量或对象的操作完全等价,这篇文章主要给大家总结介绍了C++中引用的相关知识点,需要的朋友可以参考下
    2022-05-05
  • C语言函数的基本使用和递归详解

    C语言函数的基本使用和递归详解

    一个函数在它的函数体内调用它自身称为递归调用。这种函数称为递归函数。C语言允许函数的递归调用。在递归调用中,主调函数又是被调函数。执行递归函数将反复调用其自身,每调用一次就进入新的一层
    2021-09-09
  • 简述c++ 发展史

    简述c++ 发展史

    这篇文章主要介绍了c++ 发展的过程,帮助大家更好的了解和学习c++,感兴趣的朋友可以了解下
    2020-08-08
  • 如何在C++中实现一个正确的时间循环器详解

    如何在C++中实现一个正确的时间循环器详解

    这篇文章主要给大家介绍了关于如何在C++中实现一个正确的时间循环器的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-10-10
  • C语言栈的表示与实现实例详解

    C语言栈的表示与实现实例详解

    这篇文章主要介绍了C语言栈的表示与实现,对于数据结构与算法的研究有一定的借鉴价值,需要的朋友可以参考下
    2014-07-07

最新评论