C++面试基础系列-extern

系列文章目录



C++面试基础系列-extern

1.extern关键点

在C和C++中,extern是一个关键字,用于声明一个变量或函数是在其他文件或编译单元中定义的,即它具有外部链接。以下是 extern的一些关键点:

  1. 外部链接extern关键字声明的变量或函数具有外部链接,这意味着它们可以在多个文件中访问。
  2. 声明而非定义 :使用 extern是声明一个已经在其他地方定义的变量或函数,而不是定义它们。
  3. 多文件共享 :当你想在多个文件中使用同一个全局变量或函数时,可以在其他文件中使用 extern来声明它们。
  4. 定义位置 :被 extern声明的变量或函数必须在某个文件中有确切的定义(带有类型和存储期的声明)。
  5. 头文件中使用extern经常与头文件一起使用,允许在多个源文件中包含同一个头文件,而不会因多重包含而导致变量或函数被多次定义。
  6. C++中的使用 :在C++中,extern也可以用于声明C语言编写的库中的变量和函数,因为它可以用来指定C语言的外部链接。
  7. 存储期extern声明的变量具有静态存储期,即它们在程序的整个运行期间都存在。
  8. 作用域extern声明的变量或函数在声明它们的文件中是可见的,但它们的作用域限制在声明它们的块内,除非它们在全局作用域中声明。
  9. 初始化extern声明的变量不能在声明时初始化,因为它们已经在其他地方定义并初始化了。
  10. 示例:
// file1.c
int globalVar = 42; // 定义并初始化一个全局变量

// file2.c
extern int globalVar; // 声明 globalVar,它在 file1.c 中定义

在上述示例中,globalVarfile1.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++库函数。

关于作者

  • 8
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

WeSiGJ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值