关于C的一些变量关系的杂谈 (编译 作用域 extern)

命名空间标识一个符号 编译是文件内的编译 运行时一整个程序的运行 每个符号都不能重复

 

声明一个符号:告诉编译器有这个符号

  普通声明:

    符号定义在文件中

  extern声明:

    extern a;

    符号定义在文件外,提示编译器遇到此变量或函数时,在其它模块中寻找其定义。

    extern:

      在定义的时候,这个extern居然可以被省略。 

      extern int a;//声明一个全局变量a
 
      int a; //定义一个全局变量a,定义一个可以被外部使用的全局变量
      
      // 有初始化的就是定义
      extern int a =0 ;  // 定义一个全局变量a 并给初值。一旦给予赋值,一定是定义,定义才会分配存储空间。
      int a =0;//定义一个全局变量a,并给初值,和上面是一个意思
 

定义一个符号

现代编译器都是文件内编译,链接后整个程序才融为一体。

现代编译器一般采用按文件编译的方式,因此在编译时,各个文件中定义的全局变量是互相不透明的。也就是说,在编译时,全局变量的可见域限制在文件内部。

 

这就是说,在编译阶段,各个文件中定义的全局变量相互是不透明的,编译A时觉察不到B中也定义了i,同样,编译B时觉察不到A中也定义了i。
但是到了链接阶段,要将各个文件的内容“合为一体”,因此,如果某些文件中定义的全局变量名相同的话,在这个时候就会出现错误,也就是上面提示的重复定义的错误。
 
因此,各个文件中定义的全局变量名不可相同。
 
在链接阶段,各个文件的内容(实际是编译产生的obj文件)是被合并到一起的,因而,定义于某文件内的全局变量,在链接完成后,它的可见范围被扩大到了整个程序。
这样一来,按道理说,一个文件中定义的全局变量,可以在整个程序的任何地方被使用,举例说,如果A文件中定义了某全局变量,那么B文件中应可以使用该变量。修改我们的程序,加以验证:
 
 
 
http://baike.baidu.com/link?url=blIQJ71gnHAvj3EC9Ip-SsOdMTyHX5Sft5p43ijifPUiH-eBLluRrrokfq3pyslrvXB98F72-eyZsNLnFR_Y1q
 
 

 

posted @ 2016-08-07 17:04  shinymood  阅读(431)  评论(0编辑  收藏  举报