声明和定义

分散在多个编译单元中的同名对象哪些当做声明,哪些当做定义,在C89之前有4种实现,以下按照限制越来越严格给出:

         Common 不管声明中是否有extern,对象都当成外部链接的,并当成定义。当这些模块合并的时候,同名的所有定义都定位到内存中同样的地址。Common这个称呼来自Fortrancommon storage。这个模型是Dennis Ritchie的原意。

         Relaxed Ref/Def 声明中的extern指明纯粹的引用,而不管该声明位于函数作用域之外还是之内。在所有翻译单元中,至少要存在一个定义,允许存在多个。外部定义就是文件作用域中不带存储类区分符的对象声明。没有对应定义的引用是个错误。有些实现对于用extern声明的但没有在代码中用到的对象不会为其产生引用。UnixC编译器和链接器实现这个模型,称为C语言的common extension

         Strict Ref/Def Relaxed Ref/Def差不多,只是只允许1个定义。K&R指定本模型。

         Initialization 本模型需要显式初始化来定义存储,其他声明都作为引用。

6.1 4种模型比较

模型

文件1

文件2

Common

extern int i;

int main()

{

i=1;

second();

}

extern int i;

void second()

{

third(i);

}

Relaxed Ref/Def

int i;

int main()

{

i=1;

second();

}

int i;

void second()

{

third(i);

}

Strict Ref/Def

int i;

int main()

{

i=1;

second();

}

extern int i;

void second()

{

third(i);

}

Initialization

int i=0;

int main()

{

i=1;

second();

}

int i;

void second()

{

third(i);

}

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/8182517/viewspace-663798/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/8182517/viewspace-663798/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值