C++内部链接与外部链接
来源:优易学  2010-1-14 17:30:20   【优易学:中国教育考试门户网】   资料下载   IT书店

  在说内部连接与外部连接前,先说明一些概念。

  1.声明

  一个声明将一个名称引入一个作用域;

  在c++中,在一个作用域中重复一个声明是合法的

  以下都是声明:

  int foo(int,int);           //函数前置声明

  typedef int Int;             //typedef 声明

  class bar;                   //类前置声明

  extern int g_var;           //外部引用声明

  class bar;                   //类前置声明

  typedef int Int;             //typedef 声明

  extern int g_var;           //外部引用声明

  friend test;                 //友员声明

  using std::cout;            //命名空间引用声明

  friend test;                 //友员声明

  using std::cout;             //命名空间引用声明

  int foo(int,int);           //函数前置声明

  在同一个作用域中你可以多次重复这些声明。

  有两种声明不能重复,那就是类成员函数及静态数据成员的声明

  class foo

  {

  static int i;

  static int i;//不可以

  public:

  int foo();

  int foo();//不可以

  };

  2.定义

  一个定义提供一个实体(类型、实例、函数)在一个作用域的唯一描述。

  在同一作用域中不可重复定义一个实体。

  以下都是定义:

  int y;

  class foo {...};

  struct bar {...};

  foo* p;

  static int i;

  enum Color{RED,GREEN,BLUE};

  const double PI = 3.1415;

  union Rep{...};

  void test(int p) {};

  foo a;

  bar b;

  3.编译单元

  当一个c或cpp文件在编译时,预处理器首先递归包含头文件,形成一个含有所有必要信息的单个源文件,这个源文件就是一个编译单元。这个编译单元会被编译成为一个与cpp文件名同名的目标文件(.o或是.obj)。连接程序把不同编译单元中产生的符号联系起来,构成一个可执行程序。

  4.自由函数

  如果一个函数是自由函数,那么这个函数不是类的成员函数,也不是友元函数。

  下面来看内部连接和外部连接

  内部连接:如果一个名称对于它的编译单元来说是局部的,并且在连接时不会与其它编译单元中的同样的名称相冲突,那么这个名称有内部连接(注:有时也将声明看作是无连接的,这里我们统一看成是内部连接的)。

  以下情况有内部连接:

  a)所有的声明

  b)命名空间(包括全局命名空间)中的静态自由函数、静态友元函数、静态变量的定义

  c)enum定义

  d)inline函数定义(包括自由函数和非自由函数)

  e)类的定义

  f)命名空间中const常量定义

  g)union的定义

  外部连接:在一个多文件程序中,如果一个名称在连接时可以和其它编译单元交互,那么这个名称就有外部连接。

[1] [2] [3] [4] 下一页

责任编辑:cyth

文章搜索:
 相关文章
热点资讯
资讯快报
热门课程培训