exern
  extern可以置于变量或者函数前,以表示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义。另外,extern也可用来进行链接指定。
  如果函数的声明中带有关键字extern,仅仅是暗示这个函数可能在别的源文件里定义,没有其它作用。
  extern "C"
  C++语言在编译的时候为了解决函数的多态问题,会将函数和参数联合起来生成一个中间的函数名称,而C语言则不会,因此会造成链接时找不到对应函数的情况,此时C函数需要用extern "C"进行链接指定,这句话告诉编译器,请保持我的名称,不要给我生成用于链接的中间函数名。
  用一句话简单概括extern "C"的真正目的:实现C++与C及其他语言的混合编程。
  static
  static修饰符是一个能够减少此类命名冲突的有用工具。例如,以下声明语句
  static int a;
  其含义与下面的语句相同
  int a;
  只不过,a的作用域限制在一个源文件内,对于其他源文件,a是不可见的。因此,如果若干个函数需要共享一组外部对象,可以将这些函数放到一个源文件中,把它们需要用到的对象也都在同一个源文件中以static修饰符声明。
  static修饰符不仅适用于变量,也适用于函数。如果函数f需要调用另一个函数g,而且只有函数f需要调用函数g,我们可以把函数f与函数g都放到同一个源文件中,并且声明函数g为
static:
static int
g(int x)
{
}
void f() {
b=g (a);
}
  我们可以在多个源文件中定义同名的函数g,只要所有的函数g都被定义为static,或者仅仅只有其中一个函数g不是static o因此,为了避免可能出现的命名冲突,如果一个函数仅仅被同一个源文件中的其他函数调用,我们应该声明该函数为static。
  static函数
  在C语言编程中,static的一个作用是信息屏蔽!
  比方说,你自己定义了一个文件,该文件中有一系列的函数以及变量的声明和定义,你希望该文件中的一些函数和变量只能被该文件中的函数使用,那么,你可以在该函数、变量的前面加上static,代表他们只能被当前文件中的函数使用。
  而在C++中,用static来作为信息屏蔽显得没有必要了,因为C++有了信息屏蔽的利器——class机制!类中的private属性的变量和函数对外禁止访问!
  然后是C/C++通用的函数作用域的static型的变量!其目的,也是为了信息的屏蔽!
  int fun() {
  static int a = 1;
  a++;
  }
  在第一次进入这个函数的时候,变量a被初始化为1!并接着自增1!
  以后每次进入该函数,a不会被再次初始化了,仅进行自增1的操作!
  在static发明前,要达到同样的功能,则只能使用全局变量:
  int a = 1;
  int fun() {
  a++;
  }
  那么,a的值有可能被其他函数所改变!
  后,说说类中的static变量和函数。
  这种存储属性的变量和函数是同一种类的不同实例之间通信的桥梁!
#include <iostream>
using namespace std;
class A {
public:
static int num;    //    统计创建了多少个实例
A () {num++};    //    每创建一个实例,让num自增1
//    返回通过构造函数所创建过的A类实例的数目
static int how_many_instance() {
return num;
}
}
static A::num = 0;    //    需要在类申明的外部单独初始化!
int main() {
cout << A::how_many_instance() << endl;
A a, b, c, d;
cout << A::how_many_instance() << endl;
system("pause");
}