一、 extern 关键字
extern 是C/C++语言中表明全局变量或者函数作用范围(可见性)的关键字,编译器收到extern通知,则其声明的变量或者函数可以在本模块或者其他模块使用。extern关键字的作用是共享代码。
注意事项:它的作用就是声明函数或全局变量的作用范围的关键字,仅仅是声明,不是定义,不分配空间
extern可以修饰函数和变量,但是一般不用于函数,重点是用于变量的情况。
// myheader.h
extern int globalVar; // 只是声明,不是定义
// file1.cpp
#include "myheader.h"
int globalVar = 42; // 这是定义,分配存储空间
// file2.cpp
#include "myheader.h"
// 此处不需要再次定义 globalVar,因为头文件中已经声明了它的存在
场景一:
处于同一个文件中,C++中变量一般是先定义再使用,那如果想先使用,再定义呢?亦或者定义再后,使用在前,使用时没有访问权限呢?
就可以先编写代码,最后定义变量,最后在初始处 使用extern进行声明即可。显然这种用法多此一举,没有多大意义。
- 举例如下:
#include<iostream>
using namespace std;
extern int a;
extern int b;
int gcd(int a, int b) {
int c = 0;
while (b != 0)
{
c = a % b;
a = b;
b = c;
}
return a;
}
int main() {
cout << gcd(a, b) << endl;
cout << "YES! PF!" << endl;
}
int a = 12;
int b = 18;
场景二:
在一个文件中定义一个全局变量,在另外一个文件中需要使用同一个 变量
- 举例如下:
在同一个目录文件下
去除掉extern1中的extern可以看到:
可以顺利运行
去除掉extern2中的extern可以看到:
去除掉extern1和extern2中的extern可以看到:
总结:
当在一个文件中定义之后,另外一个文件使用的时候,需要加extern,如果不加会导致重复定义,报错!
所以在实际编码的时候,可以在定义变量的时候使用这个关键字,在使用的时候也加上这个关键字。
推荐使用格式:
- 首先定义一个mod.h文件,用来声明其他文件需要访问的变量或者函数(使用extern修饰);
- 定义一个cpp文件,包含mod.h,初始化mod.h文件中的变量或者函数实现;
- 在使用的时候使用extern进行修饰,说明是访问外部其他变量。
更多的时候是使用类的成员来替代。
重要的结论:
使用 extern 修饰的变量在链接的时候只找寻同名的标号,不检查类型,所以才会导致编译通过,运行时出错。
1、在其他文件中定义过的全局变量,在另一个文件中要调用时,只需在声明语句前加关键字extern。
文件1,定义变量
int i= 1;
文件2,声明变量
extern int i;
2、对于常量,要调用其他文件的常量时,做法如下:
文件1,定义常量
extern const int i = 1;
文件2,声明常量
extern const int i;
extern “C”
extern "C"的真实目的是实现类C和C++的混合编程,不做详细解释。