详细讲解C++中extern的作用,extern变量在哪个数据段,为什么要extern C?
在C++中,extern关键字用于声明外部变量或函数。它告诉编译器某个标识符是在其他地方定义的,而不是当前文件中定义的。这样可以在一个文件中引用另一个文件中定义的变量或函数。
extern关键字可以用于两种情况:
1、声明全局变量:在一个文件中使用extern关键字声明一个全局变量,表示该变量在其他文件中定义。这样,多个文件就可以共享同一个全局变量。
示例:
// File1.cpp extern int globalVariable; // 声明全局变量 // File2.cpp int globalVariable = 10; // 定义全局变量 // File3.cpp extern int globalVariable; // 引用全局变量
在上面的示例中,File1.cpp和File3.cpp声明了同一个全局变量globalVariable,而File2.cpp定义了该全局变量的实际值。
2、声明外部函数:在一个文件中使用extern关键字声明一个函数,表示该函数在其他文件中定义。这样可以在当前文件中使用该函数,而无需了解其实际实现。
示例:
// File1.cpp
extern void externalFunction(); // 声明外部函数
// File2.cpp
#include <iostream>
void externalFunction() { // 定义外部函数
std::cout << "This is an external function." << std::endl;
}
// File3.cpp
extern void externalFunction(); // 引用外部函数
int main() {
externalFunction(); // 调用外部函数
return 0;
}在上面的示例中,File1.cpp和File3.cpp声明了同一个外部函数externalFunction,而File2.cpp定义了该外部函数的实际实现。在main函数中,可以直接调用externalFunction(),而不需要了解其具体实现。
关于extern变量存储在哪个数据段,具体取决于变量的定义位置和作用域。在C++中,全局变量和静态变量(在函数内部使用static修饰)存储在静态数据段(静态存储区)。而局部变量(函数内部定义的非静态变量)存储在栈上。
关于为什么要使用extern C,主要是为了处理C++代码与C代码的兼容性问题。C++编译器会对函数名进行名称修饰(name mangling),以支持函数重载和其他C++特性。而C编译器不会进行名称修饰。当C++代码需要调用C语言编写的函数时,需要使用extern "C"指定以C语言方式进行编译和链接,以避免名称修饰导致的链接错误。
示例:
// C code
#ifdef __cplusplus
extern "C" {
#endif
void cFunction() {
// C function implementation
}
#ifdef __cplusplus
}
#endif
// C++ code
extern "C" void cFunction(); // 声明C函数
int main() {
cFunction(); // 调用C函数
return 0;
}在上面的示例中,C函数cFunction使用了extern "C"进行声明,以告诉C++编译器以C语言方式进行链接。这样,C++代码就可以正确地调用C函数。

