extern 和static的深入分析

static和extern功能简介

在进行大型项目时,大部分的全局变量都有static或extern这两个关键字修饰,extern可以声明变量,使同一个变量可以在不同的文件中重复利用,static修饰全局变量可以屏蔽其他文件对该文件中变量的访问,防止变量名称重复

extern的功能详细说明

  1. extern “C” void func(int a),被extern “C” 开头修饰的函数会以C的规则去编译C++的代码,这个功能几乎只存在于用C++去写C的库文件之中。
  2. extern int g_int,用extern修饰的变量就是的声明而未定义(注意:extern int g_int = 0 就是声明加定义了),这个常用于一下两种情况
    1. 在头文件中声明变量,这样多个cpp文件可以对头文件进行包含,且只要在一个头文件中对这个变量进行定义就可以了,合理的实现一个变量在多个文件中的重复利用。
    2. 在其他cpp文件中已经对某个变量进行了定义,其他文件可以使用extern 该变量,使该变量的作用范围扩展到这个文件之中。比如a.cpp文件中定义了int a = 5, 在b.cpp文件中只需要写上 extern int a,即可使a的作用域扩展到b.cpp文件中。
    3. 在代码风格良好的项目中,第二种情况不应该出现或很少出现,因该尽量将在多个cpp文件中使用的变量统一声明在.h文件中

static的详细用法

在C语言中,static 只有1,2,3三种用法,但C++作为C的扩展,便有了4,5的用法

  1. 用static修饰cpp中的全局变量,改变该变量的作用域,使该变量只能在该文件中进行访问,使得在不同的cpp文件中可以定义名称完全相同的全局变量。未用static 修饰的全局变量,对于其他cpp依然可见,只要调用extern 变量 即可对该变量进行使用。
  2. 用static修饰的局部变量,使它放在.data或.bss数据段中,手动使其初始化不为0则放在.data段中,默认初始化(默认初始化会将它初始化为0)或将其手动初始化为0则将其放在.bss段中。静态局部变量只会初始化一次,每一次循环静态局部变量初值都会保持上一次循环后的值。在做一些计数程序时非常有用。
    注意,该变量的生存周期为该变量创建到文件结束,作用域为该{}内,和普通变量相同。
  3. 修饰普通函数时,和修饰全局变量一样,使其只在该文件中可见。
  4. 在修饰类的成员变量时,使该变量不属于对象,只属于类。只能在类中声明,需要在类外初始化。在写方法类时,所有外面有用的变量全部声明为public,static类型,就可以直接用类名调用唯一的变量。在写一些例如单例模式的设计模式时,类的静态成员变量会经常使用。
  5. 在修饰类的成员函数时,类似静态成员变量,不属于对象,只属于类,所以不会生成this指针,故无法声明为虚函数,在公有情况下,可以使用类直接访问静态成员函数。

总结

在做大型项目时,如果对于extern和static不是很了解,甚至可以在cpp文件中将全局变量全部声明为static,在.h文件中将需要在.cpp中定义的变量声明为extern。

发布了7 篇原创文章 · 获赞 0 · 访问量 617

猜你喜欢

转载自blog.csdn.net/qq_42055033/article/details/103834546