繁体   English   中英

在C中定义函数之前使用隐式声明时,为什么编译器无法弄清楚?

[英]Implicit declaration when using a function before it is defined in C, why can't the compiler figure this out?

如标题所述,我知道是什么原因导致此错误,但我想知道为什么在这种情况下编译器会给出此错误。

例如:

main.c

void test(){
    test1();
}

void test1(){
   ...
}

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

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

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

按照定义的方式,编译器必须对文件进行一次扫描以了解编译所需的所有信息。 必须进行两次通过会更加昂贵,因此这一规则一直延续到今天。

而且,正如peoro所指出的,此规则使编译器编写者的工作更加轻松。 更不用说IDE的自动补全功能,这也将使其更轻松。

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

哦,您的程序将编译得更快。 当您掌握了数百万个代码库时,还不错。

这就是定义C的方式。

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

这主要是为了简化编译器的工作。

简短答案:因为C是ooold。 :-)

长答案:C编译器和链接器完全分开。 您可能在不同的源文件中定义了不同的功能,然后将它们链接在一起。 在这种情况下,假设您要在单独的库源文件中定义test1 直到编译器编译了另一个文件后,编译器才知道test1 ,并且它将单独编译另一个文件,因此在编译test时就无法知道它。 因此,您必须告诉它,“是的,在其他地方确实定义了一个test1 ,这是它的签名”。 这就是为什么通常在此文件中为需要使用其功能的任何其他源文件包括一个头文件(.h)的原因。

甚至看起来似乎不是,但是这种方法还可以节省您的时间! 假设您正在编译包含数千个文件的编译单元:在您的方案中,编译器将首先必须解析数千个文件,然后才能看到“哦,此功能不存在。中止。” 它的实现方式使编译器在看到未定义的函数时立即中断。 这样可以节省您的时间。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM