为什么这个程序没有错误?

时间:2017-02-14 00:01:05

标签: c

--- a.c ----

int i; // external definition

---- main.c ------

int i=0; // external definition 

int main(void)
{
i=0;
}

在两个文件中,i是每个翻译单元中的外部定义,i用于表达式。这应该违反:

  

如果使用外部链接声明的标识符   表达式(除了作为sizeof运算符的操作数的一部分之外)   其结果是整数常量),在整个程序中的某个地方   标识符只有一个外部定义;   否则,不得超过一个.140)

1 个答案:

答案 0 :(得分:2)

这种非标准行为是在许多C编译器中实现的公共扩展

Rationale to C99 standard(见第32-34页)对此事进行了相当广泛的讨论。并且,根据该文档,这组定义在 Relaxed Ref / Def模型下是合法的,通常在UNIX OS的C89之前的C编译器中实现。这就是它受欢迎的原因,这就是为什么我们经常将它作为扩展实现的原因。它应该简化对遗留代码的支持。

然而,标准C定义模型不同:它是严格参考/ Def模型初始化模型的组合。标准C不允许这样做。

P.S。虽然ia.c的定义确实是暂定定义,但它与此问题无关。在包含翻译单元结束时,某些对象的所有临时定义组合并产生对象的外部定义。他们的“暂定”性质在模块间层面上并不明显。暂定定义不允许在不同的翻译单元中创建同一对象的多个定义。