extern关键字

基本解释

        提供以不同程序语言编写的模块间的链接。extern可以置于变量或者函数前,以标示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义。此外extern也可用来进行链接指定。

extern 字符串字面量 { 声明序列 (可选) }(1)

extern 字符串字面量 声明(2)

2.两个作用

  extern "C" 是一个链接指示,表示被标记的函数或变量使用C语言的链接方式。这样做的目的是为了解决C++因名称修饰(name mangling)造成的与C语言库链接不兼容的问题。C++为了支持函数重载,会对函数名进行修改,而C不会这么做。通过extern "C",可以让C++编译的代码能够与C语言库中的函数进行链接。

        直接使用 extern 修饰一个变量意味着告诉编译器这个变量的定义在别的地方,需要在链接时解析。它的作用就是声明函数或全局变量的作用范围的关键字,其声明的函数和变量可以在本模块活其他模块中使用,记住它是一个声明不是定义!也就是说B模块(编译单元)要是引用模块(编译单元)A中定义的全局变量或函数时,它只要包含A模块的头文件即可,在编译阶段,模块B虽然找不到该函数或变量,但它不会报错,它会在连接时从模块A生成的目标代码中找到此函数。

3.

#ifdef __cplusplus 是一个预处理指令,用来检查是否正在使用C++编译器。如果是,在这个宏定义之后的代码会被编译器所识别。这个宏通常用来在C++代码中包含C语言代码,确保C语言代码不会因为C++的名称修饰(name mangling)而发生冲突。

#ifdef __cplusplus
extern "C" {
#endif

// C语言的函数声明

#ifdef __cplusplus
}
#endif

在这段代码中,#ifdef __cplusplus 检查是否定义了__cplusplus宏,如果定义了,即意味着我们正在使用C++编译器,那么extern "C"语句会被执行,它告诉编译器以下的代码应该以C语言的方式进行链接。这保证了C++代码可以调用C语言代码且不会发生链接错误。当C++代码包含了这种结构的头文件时,就可以正确地链接到C语言编写的库中。

4.static 和extern

extern "C" double f();
static double f(); // 错误:链接冲突

static修饰的变量静态变量,仅本文件可用,与extern含义冲突。

参考:https://www.cnblogs.com/yc_sunniwell/archive/2010/07/14/1777431.html

你可能感兴趣的:(c++,开发语言)