关键字 --- extern

(一)定义变量与声明变量的区别

(1)声明变量

告诉编译器,某个变量的名字和数据类型;但是,并不给该变量开辟存储空间,因此,在声明的时候,不能给该变量赋初始值

(2)定义变量

告诉编译器,某个变量的名字和数据类型,同时,也会给该变量开辟存储空间,所以在定义的时候,可以给该变量赋初始值

(二)关键字extern的用法

extern是一种"外部声明"的关键字,也就是,在本.cpp文件中声明的函数或者全局变量,它的定义代码块却是在其他.cpp文件中

2.1 extern函数( 声明函数 )

在C++中,除了成员函数,其他函数都是全局函数!所以,用extern声明某个函数时,也可以不加extern关键字!

下面用例子来说明,怎样使用extern来声明某个函数!

假设在test01.cpp中定义了一个func函数,在test02.cpp中想调用test01.cpp中定义的func函数,有两种方法:

(1)定义test01.h头文件,在test01.h文件中,声明test01.cpp文件中定义的func函数;然后,在test02.cpp文件中 include "test01.h";这样,就可以在test02.cpp文件中,使用test01.cpp文件中定义的func函数;

下面为test01.cpp

#include "test01.h"

int func(int a, int b)
{
	int result;
	result = a + b;
	return result;
}

下面为test01.h

int func(int a, int b);

下面为test02.cpp

#include <iostream>
#include "test01.h"

int main()
{
	int result = func(3, 4);
	std::cout << "result is:" << result << std::endl;
}

(2)使用extern关键字!在test02.cpp文件中,使用extern关键字声明func函数;这样,就可以在test02.cpp文件中,使用到test01.cpp文件中定义的func函数;

下面为test02.cpp

#include <iostream>

extern int func(int a, int b);
//int func(int a, int b);  // 这个也可以

int main()
{
	int result = func(3, 4);
	std::cout << "result is:" << result << std::endl;
}

使用extern关键字的好处:

避免引入大量的头文件,进而避免引入大量的无关函数!这样做的一个明显好处是,会加速程序的编译过程( 确切的说,是预处理过程 ),节省时间!

2.2 extern全局变量( 声明全局变量 )

在test01.cpp文件中定义了一个全局变量a_01,在test02.cpp文件中,想引用test01.cpp文件中所定义的那个全局变量a_01;可以在test02.cpp文件中,extern这个全局变量a_01,这样,就可以在test02.cpp文件中,引用test01.cpp文件中定义的那个全局变量a_01。

注意:extern 全局变量a_01,可以放在test02.cpp文件中的任何地方,在test02.cpp文件中,全局变量a_01的作用范围就是,从声明的位置一直到该文件的结束之处

下面是test01.cpp

#include "test01.h"

int a_01 = 9;

int func(int a, int b)
{
	int result;
	result = a + b;
	return result;
}

下面是test02.cpp

#include <iostream>

extern int a_01;

int main()
{
	std::cout << "a_01 is: " << a_01 << std::endl;
}

extern原理,可以通俗说为:"编译器,你现在编译的cpp文件中,我所修饰的标识符( 全局变量、函数 ),虽然没有在当前cpp文件中进行定义,但是它是在其他cpp文件定义的,你要放行!"

2.3 extern "C"

在C++中想调用C语言编写的函数,就需要在C++程序中,通过extern "C",来声明,所要引用的C语言编写的函数。这种方式,是给链接器用的,告诉链接器,在链接的时候,用C函数的规范来链接。主要原因是,C++程序和C程序,在编译完成后,在目标代码中的命名规则不同

下面是用C语言编写的math.c文件:

int add(int x, int y)
{
	return x + y;
}

int sub(int x, int y)
{
	return x - y;
}

下面是用C++语言编写的test02.cpp文件:

#include <iostream>

extern "C"
{
	int add(int x, int y);
	int sub(int x, int y);
}

int main()
{
	std::cout << "add(10, 20) is: " << add(10, 20) << std::endl; // 30
	std::cout << "sub(10, 20) is: " << sub(10, 20) << std::endl; // -10
}

2.4 声明可以出现多次,定义只能出现一次

(1)一个变量,无论是否用extern对其进行修饰,只要为其赋初始值,便是定义!

extern int a = 10; // 是定义!但是, 不建议使用这种定义方式!

int a = 10; // 是定义!

上面两种方式,都是定义!第一种,最好不要使用!

(2)extern 数据类型 变量名;

一定是声明!

参考文章:

1. 【014 关键字】一文彻底搞懂extern用法-CSDN博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值