static和extern声明全局变量的区别和问题

static

  • static变量存放在静态存储区,具备持久性和默认值;
  • static修饰全局变量时该变量仅可以在声明编译单元中使用,在其他编译单元中使用时会复制一份相同的内存,但是在其他编译单元中对该变量的修改并不影响声明编译单元中定义的值;
  • 因为会复制内存使用,所以多个地方引用静态全局变量所在的编译单元,不会出现重定义错误;
    在这里插入图片描述
    ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200721133547801.png在这里插入图片描述
    上面定义了一个全局变量,可以看到两个编译单元中该变量的地址和值都是不同的,编译单元一改变后编译单元二访问到的仍是初始值;

extern

  • extern修饰符修饰的变量或者函数,表示“此变量或者函数在其它文件已经定义,在这里只做引用处理;
    在这里插入图片描述
    在这里插入图片描述

改为extern声明后会编译错误,因为将全局变量的声明和定义放在了一起,导致多次include该头文件时会出现重定义错误,全局变量最好在h中声明,cpp中定义;

放到cpp中定义后正常运行,同时也不会出现上述使用static时改动在两个编译单元中不一致的问题

你可能感兴趣的:(C++,c++)