详细讲解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函数。