(一)定义变量与声明变量的区别
(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 数据类型 变量名;
一定是声明!
参考文章:

14万+

被折叠的 条评论
为什么被折叠?



