extern
作用:在某个.cpp
文件中存在这么一个函数/全局变量
声明外部函数
在a.cpp
中使用b.cpp
中函数,需要在a.cpp
中函数使用之前用extern
修饰函数声明。
a.cpp
#include <iostream>
extern double area(int num);
int main()
{
double r;
std::cout << "Please enter radius of circle: " << std::endl;
std::cin >> r;
std::cout << area(r) << std::endl;
return 0;
}
b.cpp
#define PI 3.1415926
double area(int num) {
return PI * num * num;
}
输出
Please enter radius of circle:
1
3.14159
注: 在a.cpp
中函数声明是可以省略extern
关键字的。
声明外部全局变量
在a.cpp
中使用b.cpp
中全局变量,需要在a.cpp
中变量使用之前用extern
修饰变量声明。
b.cpp
int a = 10;
a.cpp
#include <iostream>
extern int a;
int main()
{
std::cout << "a = " << a << std::endl;
return 0;
}
注: 在a.cpp
中全局变量的声明是不能加初始值的。
若是将代码改成:
extern int a = 1;
则会报错
D:\VS2019Projects\externTest\x64\Debug\externTest.exe : fatal error LNK1169: 找到一个或多个多重定义的符号
被extern
关键字修饰的函数或全局变量,在自己的cpp文件中定义也是可以的。
例如:main.cpp
#include <iostream>
extern int a;
extern int b;
extern int sum(int num1, int num2);
int a;
int b;
int main()
{
a = 10; b = 20;
std::cout << "sum = " << sum(a, b) << std::endl;
return 0;
}
int sum(int num1, int num2) {
return num1 + num2;
}
输出
sum = 30
关于重定义
在多个cpp中,不能定义相同名字的符号。
- 不能定义相同名称的全局变量
例如,a.cpp
和b.cpp
中存在相同的全局变量。
a.cpp
#include <iostream>
int a;
int main()
{
return 0;
}
b.cpp
int a;
报错
D:\VS2019Projects\externTest\x64\Debug\externTest.exe : fatal error LNK1169: 找到一个或多个多重定义的符号
- 不能定义相同的函数。(函数相同:函数名+参数列表相同)
例如,a.cpp
和b.cpp
中存在相同的函数。
a.cpp
#include <iostream>
int sum(int num1, int num2) {
return num1 + num2;
}
int main()
{
return 0;
}
b.cpp
int sum(int num1, int num2) {
return num1 + num2;
}
报错
D:\VS2019Projects\externTest\x64\Debug\externTest.exe : fatal error LNK1169: 找到一个或多个多重定义的符号
C++是允许函数重载的,当函数名相同,参数列表不同时,编译器不会报错。例如:
a.cpp
#include <iostream>
int sum(int num1, int num2) {
return num1 + num2;
}
int main()
{
return 0;
}
b.cpp
int sum(int num1, int num2, int num3) {
return num1 + num2 + num3;
}
- 无定义的错误
当在一个cpp
文件中声明了一个函数,并且调用它。但是在链接过程中没有发现任何一个cpp文件中定义了。例如:
只在main.cpp
中声明函数sum
#include <iostream>
extern int sum(int num1, int num2);
int main()
{
sum(10, 20);
return 0;
}
error LNK2019: 无法解析的外部符号 "int __cdecl sum(int,int)" (?sum@@YAHHH@Z),函数 main 中引用了该符号