手机站
网通分站
电信主站
密 码:
用户名:
当前位置 : 主页>程序设计>C/C++>列表

解析C 中的内部连接和外部连接

来源:互联网 作者:west263.com 时间:2008-02-23
西部数码-全国虚拟主机10强!40余项虚拟主机管理功能,全国领先!双线多线虚拟主机南北访问畅通无阻!免费赠送企业邮局,.CN域名,自助建站480元起,免费试用7天,满意再付款! P4主机租用799元/月.月付免压金!
 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的定义

  外部连接:在一个多文档程式中,假如一个名称在连接时能够和其他编译单元交互,那么这个名称就有外部连接。

  以下情况有外部连接:

  a)类非inline函数总有外部连接。包括类成员函数和类静态成员函数

  b)类静态成员变量总有外部连接。

  c)名字空间(包括全局名字空间)中非静态自由函数、非静态友元函数及非静态变量

  下面举例说明:

  a)声明、enum定义、union定义有内部连接

  任何的声明、enum定义及union定义在编译后不会产生连接符号,也就是在不同编译单元中有相同名称的声明及enum、union定义并不会在连接时发生发现多个符号的错误。

// main.cpp

typedef int Int; //typedef 声明,内部连接

enum Color{red}; //enum定义,内部连接

union X //union定义,内部连接
{
 long a;
 char b[10];
};

int main(void)
{
Int i = red;
return i;
}

// a.cpp

typedef int Int; //在a.cpp中重声明一个int类型别名,在连接时不会发生错误
enum Color{blue}; //在a.cpp中重定义了一个enum Color,在连接时不会发生错误
const Int i =blue; //const常量定义,内部连接
union X //union定义,内部连接
{
 long a;
 char b[10];
};

  b)名字空间中静态自由函数、静态友元函数、静态变量、const常量定义有内部连接

// main.cpp

namespace test
{
 int foo(); //函数声明,内部连接
 static int i = 0; //名字空间静态变量定义,内部连接
 static int foo() { return 0;} //名字空间静态函数定义,内部连接
}

static int i = 0; //全局静态变量定义,内部连接
static int foo() {return 1;} //全局静态函数定义,内部连接
const int k = 0; //全局const常量定义,内部连接
int main(void)
{
 return 0;
}

//a.cpp

namespace test
{
 int i = 0; //名字空间变量定义,外部连接
 int foo() {return 0;} //名字空间函数定义,外部连接
}

int i = 0; //全局变量定义,外部连接
int k = 0; //全局变量定义,外部连接
int foo() { return 2;} //全局函数定义,外部连接

  在全局名字空间中,main.cpp中定义了静态变量i,常量k,及静态自由函数foo等,这些都有内部连接。假如您将这些变量或函数的static或是const修饰符去掉,在连接时就会现multiply defined symbols错误,他们和a.cpp中的全局变量、全局函数发生冲突。



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

文章整理:西部数码--专业提供域名注册虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

热点关注
IDC资讯 虚拟主机 域名注册 托管租用 vps主机 智能建站
网站运营 建站经验 策划盈利 搜索优化 网站推广 免费资源
网站联盟 联盟新闻 联盟介绍 联盟点评 网赚技巧
行业资讯 业界动态 搜索引擎 网络游戏 门户动态 电子商务 广告传媒
网络编程 Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术 Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷 Internet Explorer
网页制作 FrontPages Dreamweaver Javascript css photoshop fireworks Flash
程序设计 Java技术 C/C++ VB delphi
网络知识 网络协议 网络安全 网络管理 组网方案 Cisco技术
操作系统 Win2000 WinXP Win2003 Mac OS Linux FreeBSD
返回首页 |关于我们 | 联系我们 | 付款方式 | 创业联盟 | 价格总览 | 资讯中心 | 友情链接 | 网站地图 | 招贤纳士 | RSS