关于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