【发布时间】:2012-04-10 16:05:23
【问题描述】:
我一直在关注一些 C 教程,但有一点我不确定我是否理解。一些示例显示了函数原型,但没有函数定义。教程说代码应该可以编译,即使它们不会运行。
这是正确的吗?缺少函数定义的 C 程序可以编译吗?
【问题讨论】:
标签: c
我一直在关注一些 C 教程,但有一点我不确定我是否理解。一些示例显示了函数原型,但没有函数定义。教程说代码应该可以编译,即使它们不会运行。
这是正确的吗?缺少函数定义的 C 程序可以编译吗?
【问题讨论】:
标签: c
源代码将仅使用声明进行编译,但如果调用任何函数,则如果函数未在某处定义,则会发生链接器错误。
【讨论】:
是的,这是正确的。正是这一特性使得将一个大程序拆分为多个源文件成为可能。
【讨论】:
函数声明和函数定义有很大的不同。要使用函数,必须先声明函数,但必须定义所使用的函数才能编译程序。
C 编译过程是一系列步骤,将一个步骤传递给另一个步骤。在典型的编译过程中,首先运行预处理器,然后编译器为每个源文件生成汇编语言,然后汇编器将该汇编语言转换为机器代码,然后链接器将所有必要的部分放在一起。除非您声明函数,否则编译器步骤通常不会完成,但编译器并不关心函数的实际实现位置 - 它只是生成带有漏洞的汇编语言代码,可以在其中放置对实际函数的调用。链接器通过调用实际函数来填补这些漏洞。
因此,您可以声明一个函数,但在另一个文件中定义它,这可能是本教程所做的。但是,您仍然必须在 somewhere 中定义函数,否则您将无法获得完整的可执行二进制文件。
【讨论】:
是的,有一种叫做链接的东西。这是一个解析对不同符号(如变量、函数等)的引用的过程。即使编译器对函数的定义一无所知,它也很高兴。但是,如果编译器知道函数的原型,它可以检查函数是否正确使用,以便及早标记错误。
请参阅Wikipedia 或 google 以了解有关链接的更多信息。
【讨论】: