1

正如标题所说,我知道是什么导致了这个错误,但我想知道为什么编译器会在这种情况下给出它。

例如:

主程序

void test(){
    test1();
}

void test1(){
   ...
}

会给出一个隐式声明警告,因为编译器会在它读取它的声明之前到达对 test1() 的调用,我可以看到这个明显的问题(不知道返回类型等),但是为什么编译器不能做一个简单的通过获取所有函数声明,然后编译删除这些错误的代码?它看起来很简单,我不相信我在其他语言中看到过类似的警告。

有谁知道在我忽略的这种情况下此警告是否有特定目的?

4

4 回答 4

5

我猜是因为 C 是一种相当古老的语言,可以追溯到 1972 年,由于内存和速度限制,这是故意的。

它的定义方式是,编译器必须对您的文件进行一次扫描才能了解编译所需的所有内容。必须做两次通过会更昂贵,所以这个规则一直存在到今天。

此外,正如 peoro 所指出的,这条规则使编译器编写者的生活更轻松。更不用说 IDE 的自动补全功能也会让它变得更轻松。

因此,对于程序编写者来说,一个小小的烦恼就意味着编译器编写者和 IDE 制造商等人的生活变得轻松。

哦,你的程序会编译得更快。当您手头拥有数百万个代码库时,这还不错。

于 2011-01-10T09:44:59.793 回答
3

这就是定义 C 的方式。

有一个在使用前声明的规则,它强制您在使用符号之前声明它们。

这主要是为了让编译器的生活更轻松。

于 2011-01-10T09:43:00.200 回答
0

简短的回答:因为 C 太旧了。:-)

长答案:C 编译器和链接器是完全分开的。您可能在不同的源文件中定义不同的函数,然后将它们链接在一起。在这种情况下,假设您test1在单独的库源文件中进行定义。编译器在编译另一个文件之前不会知道test1,并且它单独编译另一个文件,因此它在编译时无法知道它test。因此你必须告诉它,'是的,在别处确实有一个test1定义,这是它的签名'。这就是为什么您通常在此文件中包含一个头文件 (.h),用于您需要使用其功能的任何其他源文件。

于 2011-01-10T09:47:48.373 回答
0

It might not even seem so, but this approach also saves you time! Imagine you are compiling a compilation unit with thousands of files: In your scenario the compiler would first have to pares thousands of files to then see "Oh this function does not exist. Abort." The way that it implemented makes the compilation break as soon as it sees an undefined function. This saves you time.

于 2011-01-10T09:53:00.383 回答