全局变量,extern和static以及命名空间的区别

全局变量,extern和static以及命名空间的区别
       全局变量只是在声明它的文件中有效,假如在另一个文件中声明定义了一个相同名称的全局变量,则在后续使用这两个变量的时候会产生名字上的冲突,解决的办法就是将其中一个全局变量的声明写在未命名的命名空间中,这样可以防止在另一个文件中使用同名变量的时候出现编译上的错误。原因是未命名的命名空间的所有成员在其他文件中都是不可见的,因此也就间接的解决了不同文件中相同变量,函数的重名问题。
        extern关键字用来声明变量,或者函数名以及对象名在其他文件中已经定义过,它通常只是起到一个说明的作用,只是告诉编译器这个变量来自其他文件,编译器会根据这个它提供的变量和名字在其他文件中查找。static关键字和未命名空间的作用相同,是文件级别的静态变量,也就是说它所定义的变量只能在使用它的文件中使用,而在其他文件中必须显示的包含它才可以使用(一般是使用#include包含static所在的文件)。static与extern的区别是:static是内部链接,extern是外部链接,static定义的变量只能在此变量的文件中使用,而extern则将它所声明的变量链接到其他文件,以便于链接器查找到此变量的定义部分。
        和extern相似的是,未命名的命名空间也是外部链接,在声明未命名空间的时候,系统为每个未命名空间分配了一个名字,这样就不会与其他文件中相同的名字产生冲突。
原文地址:https://www.cnblogs.com/sunfie/p/4394588.html