考虑由两个文件组成的 C 程序,
f1.c:
int x;
f2.c:
int x=2;
我对 C99 标准第 6.9.2 段的解读是,这个程序应该被拒绝。在我对 6.9.2 的解释中,变量x
在 中暂定定义f1.c
,但这个暂定定义在翻译单元的末尾变成了实际定义,因此(在我看来)应该表现得好像f1.c
包含定义一样int x=0;
。
对于我能够尝试的所有编译器(以及重要的链接器),这不是发生的事情。我尝试的所有编译平台都链接上述两个文件,两个文件中的值x
都是2。
我怀疑这是偶然发生的,或者只是作为标准要求之外提供的“简单”功能。如果您考虑一下,这意味着链接器对那些没有初始化程序的全局变量有特殊支持,而不是那些显式初始化为零的变量。有人告诉我,无论如何编译 Fortran 都可能需要链接器功能。这将是一个合理的解释。
对此有什么想法吗?标准的其他解释?哪些平台的文件名f1.c
和f2.c
拒绝链接在一起?
注意:这很重要,因为问题发生在静态分析的上下文中。如果这两个文件可能拒绝在某个平台上链接,分析器应该抱怨,但如果每个编译平台都接受它,那么没有理由警告它。