1.首先了解extern的基本定义
extern 用于定义全局变量,extern 写在(变量名/函数)之前,代表可被其他文件使用,也可在其他文件里查找。
还有要区分一点,“声明”,不是“定义”!根据C++标准的规定,一个变量声明必须同时满足两个条件,否则就是定义:
(1)声明必须使用extern关键字;(2)不能给变量赋初值
extern int a; //声明
int a; //定义
int a = 0; //定义
extern int a =0; //定义
截用其他人的经验:头文件请不要定义任何变量,那是非常业余的行为……2.代码测试extern的用法
情形1:我们最常用的的一种外部变量的用法
将(全局变量/函数)预定义到1.h头文件里,再在对应的1.cpp文件里定义好相应的变量,和写好相应的函数。另外的文件2.cpp只需要引入有预定义的.h文件即可,不需定义可直接使用。 //解释:个人感觉2.cpp引入1.h才是最重要的,因为引入了1.h中的extern变量和函数,说明可以查找使用其他文件里的变量,函数。我之所以这么说,第2个是个形象的例子。
情形2:不使用头文件,直接使用.cpp文件里的变量
1.cpp里的变量和函数,可以直接给2.cpp使用,不需要1.h进行连接。但在2.cpp里要extern显式声明。代表2.cpp里可以查找使用其他文件的变量,函数。这也是我再情形1里为什么那样说明是引入了1.h中的extern变量,函数。
#include "stdafx.h"
int n=1;
int add(int,int);
int add(int i,int j)
{
return i+j;
} 该文件是test1.cpp
#include "stdafx.h"
#include "test1.h"
#include <Windows.h>
extern int n;
extern int add(int,int);
int _tmain(int argc, _TCHAR* argv[])
{
int m;
m=add(1,2);
printf("%d\n",m);
printf("%d\n",n);
system("pause");
return 0;
} 该文件是extern.cpp
结果如图
情形3(错误情况):再次证明extern 说明是用于查找其他文件里的变量,函数的。废话不多说
#include "stdafx.h"
//#include "test1.h"
extern int n=1;
extern int add(int,int);
int add(int i,int j)
{
return i+j;
} 这是test1.cpp
#include "stdafx.h"
#include "test1.h"
#include <Windows.h>
int n;
int add(int,int);
int _tmain(int argc, _TCHAR* argv[])
{
int m;
m=add(1,2);
printf("%d\n",m);
printf("%d\n",n);
system("pause");
return 0;
} 这是extern.cpp文件
这就是错误,至于(?[email protected]@3HA)这是c++编译器编译而来的。
在.cpp文件里显示声明"c",则和"c++"的编译错误不一样了。很囧的是,它显示的错误是C的非法的链接规范