目录
总述
一、声明外部变量
二、声明外部函数
三、实现模块化编程
四、与"C" 连用,实现C和C++的混合编程
五、注意事项
六、疑点补充(你可能会有和我一样的疑问?)
总述
在C和C++中,extern关键字用于声明外部全局变量变量或函数,表明它们的定义位于其他文件中,从而允许在不同源文件之间共享变量和函数。以下是extern的常见用法:
一、声明外部变量
一)用法
在一个源文件中定义全局变量后,在其他源文件中使用extern声明该变量,以便访问它。
二)示例
file1.c:定义全局变量
int globalVar = 10;
file2.c:声明并使用该变量
extern int globalVar;void func(){printf("globalVar = %d\n",globalVar);
}
二、声明外部函数
一)用法
在一个源文件中定义函数后,在其他源文件中使用extern声明该函数,以便调用它。
二)示例
file1.c:定义函数
void func(){//函数实现
}
file2.c:声明并调用该函数
extern void func();int main(){func();return 0;
}
三、实现模块化编程
一)用法
将extern声明放在头文件中,以便多个源文件包含头文件后共享变量和函数。
二)示例
header.h
#ifndef HEADER_H
#define HEADER_Hextern int globalVar;
extern void func();#endif
file1.c
#include "header.h"int globalVar = 10;
void func(){//函数实现
}
file2.c
#include "header.h"void anotherFunc(){printf("globalVar = %d\n",globalVal);func();
}
四、与"C" 连用,实现C和C++的混合编程
一)用法
在C++中,使用extern "C"指定按照C语言规则进行函数名修饰和链接,以便调用C语言编写的库函数或在C语言中调用C++编写的函数。
二)示例
C++代码调用C函数
extern "C"{#include "c_library.h"
}int main(){c_function();return 0;
}
C代码调用C++函数
//C++ code
extern "C" void cpp_function(){//函数实现
}
五、注意事项
一)声明与定义的区别
extern用于声明变量或函数,定义时需要分配内存空间。变量只能定义一次,但可以多次声明。
二)头文件保护
在头文件中使用extern声明变量或函数时,应配合条件编译指令(如#ifndef、#define、#endif)防止头文件被重复包含。
通过合理使用extern关键字,可以提高代码的组织性和可维护性,实现模块化编程,并支持C和C++混合编程。
六、疑点补充(你可能会有和我一样的疑问?)
问:extern 引用的变量可以赋值吗?
答:在 C 和 C++ 中,使用 extern
关键字声明的变量本质上是一个指向已经在其他地方定义的变量的引用。它的主要作用是告诉编译器这个变量在其他文件中定义,可以在当前文件中使用。关于赋值的问题,下面是一些要点:
一)赋值效果:虽然在声明时使用 extern
不允许你直接给这个变量赋初始值,但你可以在任何地方(通常是在其定义所在的文件中)对其进行赋值。例如:
//file1.c
int myVar; // 定义
myVar = 10; // 可以赋值//file2.c
extern int myVar; //引用变量,不能初始化
myVar = 20; //可以赋值,虽然在其他文件中被引用void modifyValue(){myVar = 30; // 可以赋值
}int main(){modifyValue();printf("myVar = %d\n",myVar);return 0;
}
二)初始化与赋值:如果在同一作用域内声明变量,extern声明的变量不能被初始化。例如:
extern int myVar = 10; //错误:无法初始化extern声明的变量
三)在函数内:在函数内部,你可以访问extern声明的变量并对其赋值,但前提是该变量在其他地方有定义。
总之,extern引用的变量是可以被赋值的,但你在声明时不能直接初始化它。