目录
1.extern
(1)概念
extern关键字,一般用在变量名前或函数名前,用来告诉编译器“这个变量/函数是在别处定义的,要在此处引用”。
使用语法:extern 函数声明或变量声明
(2)用法
1.声明外部函数:在A.cpp文件中声明一个函数,B.cpp文件也想使用此函数,可以在B.cpp中利用关键字extern实现。通过代码一和代码二共同完成验证。(本文代码均在win10系统VS2019进行验证)
代码一:在other.cpp中定义一个函数。
//代码一
#include "iostream"
using namespace std;
//other.cpp中定义求矩形面积的函数
void area(int longth,int wide) {
cout << "矩形面积:" << longth * wide << endl;
}
代码二:在main.cpp中使用在other.cpp中定义的函数。
//代码二
#include "iostream"
using namespace std;
//main.cpp
extern void area(int longth, int wide);//声明函数时,extern可以取消。
int main() {
area(3, 4);//输出 矩形面积:12
}
2.声明外部全局变量:在A.cpp文件中声明一个全局变量,B.cpp文件也想使用此变量,可以在B.cpp中利用关键字extern实现。通过代码三和代码四共同验证。
代码三:在other.cpp中定义一个全局变量。
//代码三
#include "iostream"
using namespace std;
//other.cpp中定义一个全局变量
int longth = 120;
代码四:在main.cpp中使用在other.cpp中定义的全局变量。
//代码四
#include "iostream"
using namespace std;
//main.cpp
extern int longth;
int main() {
cout << "longht = " << longth << endl;//输出 longht = 120
}
3.extern声明本文件内的函数或变量:在A.cpp中修饰A.cpp的函数或变量
代码五:
//代码五
#include "iostream"
using namespace std;
//main.cpp
extern void area(int longth, int wide);
extern int lon;
int main() {
area(3, 4);//输出 矩形面积:12
cout << "lon = " << lon << endl;//输出 lon = 10
}
void area(int longth, int wide) {
cout << "矩形面积:" << longth * wide << endl;
}
int lon = 10;
(3)注意事项
1.重定义错误:当A.cpp中存在一个和B.cpp中相同的函数或变量X时,如果在A中用extern声明X时,就会产生重定义错误。
2.无定义错误:在A.cpp中使用extern声明了一个函数,但在链接过程中没有在任何cpp文件中发现此函数的定义。(举例:在银行如果没有存钱,却想要去取钱,这就是错误的。)
(4)总结
extern一般是在多文件之间需要共享某些代码时使用,并且这些文件需要在同一项目下。告诉编译器,同一项目下在某个cpp文件中,存在这么一个函数或变量。
2.static
(1)概念
将被static修饰的变量存储在静态区,在整个程序的运行区间都存在,程序结束后释放。
(2)用法
1.修饰局部变量
代码六:修饰局部变量时,会将该变量的变化保存,代码如下。
//代码六
#include "iostream"
using namespace std;
void Prin() {
static int m = 0;
cout << m << " ";
m++;
}
int main() {
int num = 5;
while (num) {
Prin();
num--;
}//输出 0 1 2 3 4
}
2.修饰全局变量
代码七:修饰全局变量时,本文件内的成员将共享这个全局变量。
//代码七
#include "iostream"
using namespace std;
static int m = 0;
void P1() {
cout << "P1:" << m<<endl;
m = 5;
}
void P2() {
cout << "P2:" << m << endl;
}
int main() {
P1();//输出 P1:0
P2();//输出 P2:5
}
(3)特点
static修饰全局成员时会将成员私有化,使得只能在本cpp文件中使用。通过代码八和九进行验证
代码八:在other.cpp中定义static成员。
//代码八
#include "iostream"
using namespace std;
//other.cpp中定义静态成员
static int m = 10;
static void Prin() {
cout << "Prin()" << endl;
}
代码九:在main.cpp中声明static成员时失败,编译器报错。
//代码九
#include "iostream"
using namespace std;
//main.cpp
//extern int m; 会报错
//extern static int m; 会报错
//extern void Prin(); 会报错
//static extern void Prin(); 会报错
int main() {
//cout << "m:" << m << endl;
//Prin();
}