系列文章目录
C++面试基础系列-extern
1.extern关键点
在C和C++中,extern
是一个关键字,用于声明一个变量或函数是在其他文件或编译单元中定义的,即它具有外部链接。以下是 extern
的一些关键点:
- 外部链接 :
extern
关键字声明的变量或函数具有外部链接,这意味着它们可以在多个文件中访问。 - 声明而非定义 :使用
extern
是声明一个已经在其他地方定义的变量或函数,而不是定义它们。 - 多文件共享 :当你想在多个文件中使用同一个全局变量或函数时,可以在其他文件中使用
extern
来声明它们。 - 定义位置 :被
extern
声明的变量或函数必须在某个文件中有确切的定义(带有类型和存储期的声明)。 - 头文件中使用 :
extern
经常与头文件一起使用,允许在多个源文件中包含同一个头文件,而不会因多重包含而导致变量或函数被多次定义。 - C++中的使用 :在C++中,
extern
也可以用于声明C语言编写的库中的变量和函数,因为它可以用来指定C语言的外部链接。 - 存储期 :
extern
声明的变量具有静态存储期,即它们在程序的整个运行期间都存在。 - 作用域 :
extern
声明的变量或函数在声明它们的文件中是可见的,但它们的作用域限制在声明它们的块内,除非它们在全局作用域中声明。 - 初始化 :
extern
声明的变量不能在声明时初始化,因为它们已经在其他地方定义并初始化了。 - 示例:
// file1.c
int globalVar = 42; // 定义并初始化一个全局变量
// file2.c
extern int globalVar; // 声明 globalVar,它在 file1.c 中定义
在上述示例中,globalVar
在 file1.c
中定义并初始化。在 file2.c
中,使用 extern
关键字来声明 globalVar
,表示它在其他地方定义,这样 file2.c
就可以访问 globalVar
了。
extern
是C和C++中实现不同文件间全局变量和函数共享的重要机制。
2.C++ extern "C"
在C++中使用C语言编写的库时,extern "C"
(注意C是大写的)是一个特殊的声明,它告诉C++编译器按照C语言的规则来处理被声明的实体。这主要是因为C++支持函数重载,而C语言不支持。以下是 extern "C"
的一些特别作用:
- 语言链接指示 :
extern "C"
指示编译器,被声明的函数或变量遵循C语言的链接规则,而不是C++的命名规则(Name Mangling)。 - 避免名称重整(Name Mangling) :C++编译器会对函数名进行编码(即名称重整),以支持函数重载。而C语言没有函数重载的概念,其函数名在编译后不会改变。使用
extern "C"
可以防止C++编译器对C函数名进行重整。 - 兼容C库 :当需要链接C语言编写的库时,使用
extern "C"
可以确保C++代码能够正确调用C库中的函数和变量。 - C++和C的互操作 :
extern "C"
是C++代码与C代码进行互操作的一种方式,使得C++程序能够直接调用C语言的函数和访问全局变量。 - 头文件包含 :在使用C语言库的头文件时,通常也会用
extern "C"
将整个头文件的内容包裹起来,以确保所有引用的函数和变量都遵循C语言的链接规则。 - 全局作用域 :
extern "C"
声明通常放在全局作用域中,以确保整个程序中的C++代码都遵循相同的链接规则。
extern "C"
是C++中处理C语言库的重要工具,它确保了C++代码能够与C语言代码无缝集成和互操作。
3.使用示例
- C++中使用 extern “C” 示例 :
// 假设有一个C语言写的库函数,声明如下:
// int CFunction(); // C语言中的函数声明
// 在C++中调用C语言写的库函数
extern "C" {
int CFunction(); // 使用extern "C"声明
}
int main() {
int result = CFunction(); // 正确调用C函数
return 0;
}
- C并不能直接调用C++库函数。
关于作者
- 微信公众号:WeSiGJ
- GitHub:https://github.com/wesigj/cplusplusboys
- CSDN:https://blog.csdn.net/wesigj
- 微博:
- -版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。