C语言
static
在C语言中 static 主要用于定义全局静态变量、定义局部静态变量、定义静态函数。
全局静态变量:在全局变量前加上关键字 static ,该全局变量就成了全局静态变量。
特点:1.存储在静态区中的数据段。
2.如果没有初始化,其默认值为0。
3.该变量在本文件内从定义开始到文件结束可见,且在外部文件不可见。
局部静态变量:在局部变量前加上关键字 static ,该局部变量就成了局部静态变量。
特点:1.存储在静态区中放入数据段。
2.它始终驻留在静态区,知道程序运行结束。
3.该变量的作用域为局部作用域,当定义它的函数或语句块结束时,其作用域随之结束。
静态函数:在函数返回类型前加上 static 关键字,函数就被定义为静态函数。
特点:1.静态函数只在本源函数中使用。
2.在文件作用域中声明的 inline 函数默认为 static 函数。
extern
在C语言中 extern 主要用在变量的声明前、用在函数的声明前、用于指示C/C++的调用规范。
extern修饰变量的声明:用来说明此变量在别处定义,要在此处引用。
注:若 test.c 中需要引用 test1.c 中的变量 int a ,在 test.c 中声明 extern int a 就可以使用。需要注意的是,被引用变量 a 的链接属性必须是外连接 (external)的,也就是 test.c 中要引用到变量 a ,不仅取决于声明中的 extern ,还取决于变量 a 本身是能够被引用到的。这里涉及到另外一个话题——变量的作用域。能够被其他模块以 extern 引用到的变量通常是全局变量。
extern修饰函数的声明:用来说明此函数在别处定义,要在此处引用。
本质上来说,变量和函数没有区别。函数名是指向函数二进制开头处的指针。如果文件 test.c 要引用 test1.c中的函数,比如在 test1.c 中原型是 int func(int m),那么就可以在 test.c 中声明 extern int func(int m),然后就能使用 func() 函数。就像变量的声明一样,extern int func(int m) 可以放在 test.c 中的任何位置,而不一定非要放在 test.c 的文件作用域的范围中。
对其他模块中函数的引用,最常用的方法是包含这些函数声明的头文件。
使用 extern 和包含头文件来引用函数的区别:
extern 的引用方式比包含头文件要间接得多。extern的使用方法是直接了当的,想引用哪个函数就用extern声明哪个函数。这大概是kiss原则(懒人原则,换句话来说,简单就是美)的一种体现。这样做的一个明显的好处是,会加速程序的编译(确切地说是预处理)的过程,节省时间。在大型C程序编译过程中,这种差异是非常明显的。
extern 用于指示C/C++的调用规范:比如在C++中调用C库函数,就需要在C++程序中用extern "C"声明要引用的函数。这是给链接器使用的,告诉链接器在链接的时候用C函数规范来链接。主要原因是C++和C程序编译完成后再目标代码中命名规则不同。
C++
2.类静态成员可用 类名: :静态成员 或 对象.静态成员 来访问。
3. 类的静态成员变量必须在类外定义,定义时不添加 static 关键字。
4.静态成员和普通成员一样,也有public、protrcted、prixate 3种访问级别,也可以具有返回值,const修饰符等参数。
类的静态成员函数:在类的函数返回值前加上 static ,该函数就声明为静态成员函数。
特点:1.类的静态成员函数没有默认this指针,因此在它里面不能使用任何非静态成员
(即静态成员之间可以相互访问,包括静态成员函数访问静态数据成员和访问静态成员函数;
非静态成员函数可以任意地访问静态成员函数和静态数据成员;
静态成员函数不能访问非静态成员函数和非静态数据成员)。
2.由于没有this指针的额外开销,因此静态成员函数与类的全局函数相比速度上会有少许的增长。
3..出现在类体外的函数定义不能指定关键字static。
4.静态成员函数可以继承和覆盖,但不能是虚函数。
extern
.在C++中 extern 的用法有 变量的声明和定义、在多个文件中共享 const 对象。
变量的声明和定义:C++中支持分离式编译机制,为了支持这个机制,C++允许将声明和定义分离开来。
声明: extern int a;
定义: extern int a =2;
注:变量能且只能被定义一次,但是可以被声明多次。
在多个文件中共享 const 对象:只在一个文件中定义 const ,而在其他多个文件中声明使用者这个文件。
//file1.cpp定义并初始化和一个常量,该常量能被其他文件访问
extern const int bufferSize = function();
//file1.h头文件
extern const int bufferSize; //与file1.cpp中定义的是同一个
extern一般是使用在多文件之间需要共享某些代码时。