extern函数的作用在vs2010中好像没什么用

 本人在过去学习c++的过程中一直沒有特别在意头文件的包含法则,以及声明和定义的区别感觉基本上也是相安无事。因此也未曾仔细学习extern函数的作用的用法今天又学習c++primer到2.4节,下定决心要把这个搞明白
    经过网上查阅资料,关于“什么时候使用extern函数的作用”有一个入门的原则:链接时不出错……
    首先峩假设你已经了解了定义和声明的区别以及头文件在预处理时的展开。那么可以接下来看我浅析以下……
    首先对于任何变量和函数都只能萣义一次不然就会出现重定义的报错。在我使用vs2010的过程中发现有些重定义是只有warning的("xx" 已在 ff.obj 中定义;已忽略第二个定义),这个本来应該是error的问题都已经淡化成warning了……言归正传正因为定义操作必须只能出现在一次,而某个头文件可能被多个源文件包含(即使使用预编译宏处理每个源文件都只包含一次头文件),因此在程序运行的全局范围内就出现了重定义

这个例子中,因为x是全局变量(”非const变量默認为extern函数的作用“——《c++primer》)因此x重定义了,编译器将在链接时报错为了避免重定义,有两种解决方法:一是使用“extern函数的作用”将頭文件中的定义变成声明。


    二是使用”const"修饰符x变为文件局部变量(已经变为常量了因此有些受限)-作用域在该文件内

C++中extern函数的作用的用法非常重要extern函数的作用最基本的用法是声明全局变量的。这里需要注意两点一是“声明”,二是“全局变量”;我们先来分析这两个概念

声明:聲明和定义是有区别的。声明不等于定义声明只是指出了变量的名字,并没有为其分配存储空间;定义指出变量名字同时为变量分配存儲空间定义包含了声明。例如:

extern函数的作用inti;//声明变量i但没分配存储空间,还不能使用

inti;//定义了变量i,并分配了空间可以使用。

注意:在程序中一个变量可以声明多次但只能定义一次。

如果声明时有初始化式也会被当做定义,例如:

后面的程序中若再出现extern函数的作鼡inti=5;或者inti;的语句就会出错,因为变量只能定义一次

全局变量:通俗讲,在函数内部定义的变量称为局部变量它的作用域是从定义处知道函数结束;在函数外部定义的称为全局变量,它的作用域是从定义处直到文件结束

注意:不管是全局变量还是局部变量,作用域都昰从定义处开始的例如:

inti=5;//变量i的作用域从这里开始

理解了这两个概念,我们回过头看extern函数的作用的作用extern函数的作用的作用是扩大全局變量的作用域,本来全局变量的作用域是从定义处开始直到文件结束使用extern函数的作用提前声明之后就变成从声明处开始,直到文件结束那么,对于上面这个程序作如下修改时不是就对了呢?

其实是错误的因为前面说了,extern函数的作用是用来声明全局变量的而i是局部變量,如果将变量i在main函数外部定义就对了如下:

extern函数的作用inti;//声明之后,变量i的作用域从该处开始直到文件结束

使用:在实际编程中,囿时程序需要包含多个源文件若这些文件有共同使用的变量,那么这个变量就遵循“一次定义多次声明”的形式。即在一个文件中定義其他文件使用时先进行声明。例如在文件file1中定义了一个变量:

若想在文件file2也使用这个变量就可以如下:


extern函数的作用inti;//此时,编译器就知道i是一个已在其他地方定义的变量会自动在本文件
i=6;//声明之后,就可在file2中对变量操作
注意:这种使用对于const变量是个例外Const类型变量默认為当前文件的局部变量,即便在其他文件中声明了也不能使用要想在其他文件中使用,定义const类型变量时必须在前面显式指出是extern函数的作鼡例如:
此时就能在其他文件中声明并使用了。具体这反面的原因和头文件的使用有关这里就不详述了。

   在源文件A里定义的函数在其他源文件中是看不见的(即不能訪问)。为了在源文件B里能调用这个函数应该在B的头部加上一个外部声明:


 
这样,在源文件B里也能够调用那个函数了  
注意这里的用词差别:在A里是定义,在B里是声明一个函数仅仅能(也必须)在一个源文件中被定义,可是能够在其他多个源文件中被声明定义引起存储分配,是真正产生那个实体而声明并不引起存储分配。打一个粗俗的例如:在源文件B里声明后好比在B裏开了一扇窗,让它能够看到A里的那个函数

  1.extern函数的作用用在变量声明中经常有这样一个作用,你在*.c文件里声明了一个全局的变量這个全局的变量假设要被引用,就放在*.h中并用extern函数的作用来声明  2.假设函数的声明中带有keywordextern函数的作用,仅仅是暗示这个函数可能在别嘚源文件里定义没有其它作用。即下述两个函数声明没有差别:
  ================================
  假设定义函数的c/cpp文件在相应的头文件里声明了定义的函数那么在其它c/cpp文件里要使用这些函数,仅仅须要包括这个头文件就可鉯  假设你不想包括头文件,那么在c/cpp中声明该函数一般来说,声明定义在本文件的函数不用“extern函数的作用”声明定义在其它文件裏的函数用“extern函数的作用”,这样在本文件里调用别的文件定义的函数就不用包括头文件
“*.h”
来声明函数声明后直接使用就可以。
  ================================  举个样例:  //extern函数的作用.cpp内容例如以下:
%s/n",s);  
}    结果程序能够正常执行输出结果。假设把“extern函数的作用”去掉程序依旧能够正常执行。    由此可见“extern函数的作用”在函数声明Φ可有可无,仅仅是用来标志该函数在本文件里定义还是在别的文件里定义。仅仅要你函数在使用之前声明了那么就能够不用包括头攵件了。

 如:类结构体后面的分号
 
隐藏得深的是宏、.h文件的问题就要费点心思了


 
假设以上不能解决这个问题,那么就请看下面内容.引起这種错误,有可能你仅仅是添加了一个.H.CPP的文件.这时你就要按上面所说.
名含"stdafx.h"就可以.假设还要在多个文件中同一时候使用结构类型,你就要继续向丅看了.一定会有不少收获的.

 类型的定义和类型变量的定义不同,
 
类型定义仅仅是描写叙述一个类型

 
是给编译器看的,

 
不会产生可运行代碼

 
变量定义是指在运行文件里真实得存在这么一块内容。

 由于每一个.c里都要写清楚类型定义非常麻烦
 
所以一般都把类型定义写在.h

 
这樣定义变量,

 
不需把整个类型的描写叙述再写一遍

我要回帖

更多关于 extern函数的作用 的文章

 

随机推荐