我正在从 K&R 学习 C 并且在本书的第 4.4 部分中提到范围规则时感到困惑。在我继续之前,让我发布我正在处理的源文件。
#include <stdio.h>
void first(void);
int main(void) {
printf("In main.\n");
first();
second();
return 0;
}
void first(void) {
printf("In first.\n");
}
void second(void) {
printf("In second.\n");
}
现在,除非我比我想象的更愚蠢,否则这本书给了我这样的想法:函数原型(在与函数定义相同的文件中)是出于范围界定的原因而存在的。也就是说,它们的存在是为了允许在编译文件的顶部声明函数,以便提前通知源文件的其余部分是否存在“对象”(如果我可以这样称呼它)。
我对上述代码的问题是在我正在使用GCC version 4.7.1
上述文件的 Arch Linux 虚拟机中无法编译并给出以下错误:conflicting types for second
.
但是,当在我的物理机器上运行相同的代码时,运行Ubuntu 12.04和GCC 版本 4.6.3,它编译得很好。
我的问题是:这是编译器功能吗?second
因为如果不是,我很惊讶它完全可以编译,因为,没有函数原型main
(如果我理解正确的话)不应该知道second
' 的存在。