--- a.c ----
int i; // external definition
---- main.c ------
int i=0; // external definition
int main(void)
{
i=0;
}
在两个文件中,i
是每个翻译单元中的外部定义,i
用于表达式。这应该违反:
如果使用外部链接声明的标识符 表达式(除了作为sizeof运算符的操作数的一部分之外) 其结果是整数常量),在整个程序中的某个地方 标识符只有一个外部定义; 否则,不得超过一个.140)
答案 0 :(得分:2)
这种非标准行为是在许多C编译器中实现的公共扩展。
Rationale to C99 standard(见第32-34页)对此事进行了相当广泛的讨论。并且,根据该文档,这组定义在 Relaxed Ref / Def模型下是合法的,通常在UNIX OS的C89之前的C编译器中实现。这就是它受欢迎的原因,这就是为什么我们经常将它作为扩展实现的原因。它应该简化对遗留代码的支持。
然而,标准C定义模型不同:它是严格参考/ Def模型和初始化模型的组合。标准C不允许这样做。
P.S。虽然i
中a.c
的定义确实是暂定定义,但它与此问题无关。在包含翻译单元结束时,某些对象的所有临时定义组合并产生对象的外部定义。他们的“暂定”性质在模块间层面上并不明显。暂定定义不允许在不同的翻译单元中创建同一对象的多个定义。