为什么在 C 中调用未定义的函数不会给出编译器错误并给出链接器错误?

Why does call to an undefined function does not give a compiler error and gives linker error in C?

提问人:buttontech 提问时间:5/21/2021 更新时间:5/21/2021 访问量:288

问:

如果在 C 程序中,我调用的函数未在作用域中的任何位置定义或声明,那么我会在链接时收到错误,但在编译时不会。我想知道为什么这在编译时不会产生错误?

函数 编译器错误 链接器错误 未定义引用

评论


答:

0赞 Antonio Petricca 5/21/2021 #1

在 C 语言中,与其他编程语言一样,编译过程由两个主要步骤组成:

  1. 编译
  2. 连接

在第一步中,所有函数,以及各自的签名(目前已经足够了),都必须在调用方的范围内声明并可见。此步骤将生成一个目标文件,该文件包含可重定位但尚不可执行的机器代码。

在第二步也是最后一步中,将目标文件链接到系统和/或用户库。现在,每个声明的函数都解析为其实现的对应函数(现在,如果它不存在,链接器将生成错误)并使其可执行。

这就是原因。

评论

0赞 buttontech 5/21/2021
这是可以理解的。与函数调用不同,如果我尝试在代码中使用未定义的变量,则在编译时会出现错误。为什么在未定义变量的情况下会有所不同?
0赞 Antonio Petricca 5/21/2021
变量就像一个函数:如果不声明它们,则无法引用它们。它是任何编译编程语言的基础。
0赞 buttontech 5/21/2021
您能再解释一下为什么不能引用未定义的变量而未定义的函数可以吗?
0赞 Antonio Petricca 5/21/2021
正如我所说,函数不能未定义,它们可以被声明,但稍后在库或目标文件中实现。我建议你读一些这样的文章 google.com/search?q=compiling%20and%20linking