Extern和Static用法总结

先给出程序内存分布图示:

堆区、BSS区、静态区三部分的内存变量直到程序运行结束才会释放,堆区内存也可以手动释放(即实现数据共享的原因);
栈区内存由系统自动释放(函数运行完,函数内部局部变量自动清除),且栈区内存大小固定(2M),所以局部变量尽量不要定义过大的数组;

static

static可以实现数据共享和作用域限定功能

静态变量

静态局部变量:只能在本函数内使用,但当函数被多次调用时也可以实现数据共享,函数结束后变量仍存在,下此调用到此函数时继续使用;
静态全局变量:只能在本模块作用域内被使用
静态成员变量:
数据可共享,可被多个对象共用;
静态成员变量的内存既不是在声明类时分配,也不是在创建对象时分配,而是在(类外)初始化时分配。反过来说,没有在类外初始化的 静态成员变量不能使用。
静态成员变量既可以通过对象名访问,也可以通过类名(域)直接访问,但要遵循 private、protected 和 public 关键字的访问权限限制

静态方法

普通静态函数:只能在定义模块作用域内被使用,声明时也需要加上static关键字
静态成员函数:
静态函数不包含有编译器提供的隐藏的this指针,它在类没有实例化的时候就存在,所以可以直接用 (类名::函数) 来调用,并且由于没有this指针,所以也就没有特定的成员变量供它用,因为类没有实例化前,这些类成员变量不存在,系统也没有分配空间给这些变量,且没有this指针,也无法调用这些成员变量,所以他只能使用那些类没有实例化前就已经存在的静态变量。最后要说的一点是,静态成员是可以独立访问的,也就是说,无须创建任何对象实例就可以访问

Extern

extern int a;//声明一个全局变量;
int a; //定义一个全局变量;

extern int a =0 ;//定义一个全局变量a 并给初值;
int a =0;//定义一个全局变量a,并给初值;

即:Extern且无初始化才是声明,其他均为定义;

注意:

  1. 局部变量不能Extern
  2. 函数和全局变量默认是Extern的,当要在其他源文件声明使用时必须加Extern声明;
  3. 头文件只是一个外部说明文件,包含在源文件只起到展开作用,so,一般都禁止在头文件定义变量变量;
  4. 跨模块使用全局变量时,必须先声明,或者包含有声明的头文件;
  • 值在编译时就已知的const 变量的定义可以放到头文件中,如:const int num(10);
  • 类的定义可以放到头文件中
  • inline 函数

PS:声明可以无数次声明,但定义只能有一次;

extern "C"

#ifdef __cplusplus (其中__cplusplus是cpp中自定义的一个宏!!!)
extern "C"{
……
}
#endif

extern "C"的主要作用就是为了能够正确实现C++代码调用其他C语言代码。加上extern "C"后,会指示编译器这部分代码按C语言的规范进行编译和链接,而不是C++的。由于C++支持函数重载,因此编译器编译函数的过程中会将函数的参数类型也加到编译后的代码中,而不仅仅是函数名;而C语言并不支持函数重载,因此编译C语言代码的函数时不会带上函数的参数类型,一般仅包括函数名。

posted @ 2020-09-11 20:55  Lounaver  阅读(478)  评论(0)    收藏  举报