c/c++中extern关键字的编译原理和使用

                   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

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


c/c++中extern关键字的编译原理和使用_第1张图片

结果如图

情形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


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文件


c/c++中extern关键字的编译原理和使用_第2张图片


这就是错误,至于(?n@@3HA)这是c++编译器编译而来的。

c/c++中extern关键字的编译原理和使用_第3张图片

在.cpp文件里显示声明"c",则和"c++"的编译错误不一样了。很囧的是,它显示的错误是C的非法的链接规范

                       

                       

你可能感兴趣的:(c/c++学习笔记)