Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1496643
  • 博文数量: 148
  • 博客积分: 2234
  • 博客等级: 大尉
  • 技术积分: 3225
  • 用 户 组: 普通用户
  • 注册时间: 2012-05-17 21:34
个人简介

未来很长。

文章存档

2017年(7)

2016年(4)

2015年(1)

2014年(6)

2013年(31)

2012年(99)

分类: C/C++

2012-06-13 20:09:26

在C语言中,我们用过extern来声明外部变量,可是它真正的含义是什么呢?我们下来看一下:现代编译器一般采用按文件编译的方式,因此在编译时,各个文件中定义的全局变量是互相透明的,也就是说,在编译时,全局变量的可见域限制在文件内部,下面举一个简单的例子。创建一个工程,里面含有A.cpp文件和,B.cpp文件,其示例如下:

点击(此处)折叠或打开

  1. //A.cpp
  2. int i;
  3. void main()
  4. {

  5. }

点击(此处)折叠或打开

  1. //B.cpp
  2. int i;

这两个文件极为简单,在A.cpp中定义了一个全局变量i,在B中我们也定义了一个全局变量i.

我们分别对A和B编译,都可以正常通过编译,但是进行链接的时候,却出现了错误,错误提示如下所示:

点击(此处)折叠或打开

  1. Linking...
  2. B.obj : error LNK2005: "int i" (?i@@3HA) already defined in A.obj
  3. Debug/A.exe : fatal error LNK1169: one or more multiply defined symbols found
  4. Error executing link.exe.
  5. A.exe - 2 error(s), 0 warning(s)

我们可以看到编译的时候出现了错误,其实也就是说在编译阶段各个文件中定义的全局变量是相互透明的,你在编译A文件的时候根本觉察不到B文件中也定义了i,同理在编译B文件时也觉察不到在A文件中定义了i,但是到了链接的时候出现了错误,为什么呢?

这是因为在链接的时候,链接器要把所有的工程中的源文件都链接到一块,所以在把A文件和B文件链接到一块的时候便觉察到了变量i的重复定义。

因此,各个文件中定义的全局变量名不可相同,在链接阶段,各个文件中的内容(实际上是编译器产生的obj)文件被合并到一块,定义于某文件内的全局变量,在链接完成之后,它的可见范围扩大到了整个程序。

这样一来,按道理说,一个文件中定义的全局变量,可以再整个程序的任何地方被使用,举例说,如果A中定义了某个变量,那么在文件B中应该可以改这个变量,修改我们得程序,加以验证:

点击(此处)折叠或打开

  1. //A.cpp
  2. void main()
  3. {
  4.    i=100;
  5. }


 

点击(此处)折叠或打开

  1. //B.cpp
  2. void main()
  3. {
  4.   int i;
  5. }

进行编译:

点击(此处)折叠或打开

  1. Compiling...
  2. A.cpp
  3. C:\Documents and Settings\wangjian\桌面\try extern\A.cpp(5) : error C2065: 'i' : undeclared identifier
  4. Error executing cl.exe.
  5. A.obj - 1 error(s), 0 warning(s)

我们看见在这个时候又出现了问题,所以我们可以断定这个错误是肯定存在的,因为全局变量的可见性是扩展到整个文件在编译完成之后链接的时候,而在编译的时候它只局限于本文件中,所以会出现错误,那现在该怎么解决呢?

C给我们提供了一种机制,那就是用extern来声明外部变量,修改代码,我们试一下:

点击(此处)折叠或打开

  1. //A.cpp
  2. extern int i;
  3. void main()
  4. {
  5.   i=100;
  6. }

点击(此处)折叠或打开

  1. //B.cpp
  2. void main()
  3. {
  4.   int i;
  5. }

现在开始进行编译:OK!通过编译了,那我们现在知道extern的作用了吧!



 





 


 


 


 

 

 

 

阅读(1405) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~