关键字extern用法

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中,不能定义相同名字的符号。

  1. 不能定义相同名称的全局变量

例如,a.cppb.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: 找到一个或多个多重定义的符号
  1. 不能定义相同的函数。(函数相同:函数名+参数列表相同)

例如,a.cppb.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;
}
  1. 无定义的错误

当在一个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 中引用了该符号
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值