[这是我给一位问我“此行为被 ANSI 标准提及为‘通用扩展’,绝非双关语”是什么意思的人的邮件回复。]

我想,如果你对 FORTRAN 不太了解,这确实有点晦涩难懂。

在 FORTRAN 中,有一种叫做“COMMON 块”的数据结构,据我回忆,它是用于在分离编译的程序模块之间共享全局数据的主要方式。使用起来很麻烦:你必须在每个源文件顶部的 COMMON 指令中提及相同的变量名,并且顺序相同。(实际上,你也可以通过故意错配 COMMON 块中的变量名或类型,来检查一个类型值的位模式,就像你在 C 语言中使用联合(union)一样。)当你向 COMMON 块添加另一个变量时,你必须记住在所有源文件中该 COMMON 块的所有定义中都添加它。如果你从未听说过预处理器或源文件包含(也就是 C 语言的#include之类的机制),你就会自己发明这个想法,并希望它存在于 FORTRAN 中。(至少在我使用 FORTRAN 的标准版本时,它并不存在,尽管某些编译器——可能包括 Unix 的编译器——将其作为扩展支持。)

这是背景介绍。在 C 语言中,全局变量的处理方式一直存在一些不确定性,这自然也是 FAQ 1.7 存在的原因。特别是,在 C 语言的经典实现中,可以在多个源文件中定义一个全局变量,例如

	int i;
只要其中只有一个定义有显式初始化器,链接器就会意识到它们都是同一个变量,并在内存中大致地将它们叠加起来。这被称为“通用模型”(common model),不是因为它很受欢迎或广泛使用(尽管它确实如此),而是因为它让人联想起 FORTRAN 的 COMMON 块。