【问题标题】:C Compilation With missing function definitions缺少函数定义的 C 编译
【发布时间】:2012-04-10 16:05:23
【问题描述】:

我一直在关注一些 C 教程,但有一点我不确定我是否理解。一些示例显示了函数原型,但没有函数定义。教程说代码应该可以编译,即使它们不会运行。

这是正确的吗?缺少函数定义的 C 程序可以编译吗?

【问题讨论】:

    标签: c


    【解决方案1】:

    源代码将仅使用声明进行编译,但如果调用任何函数,则如果函数未在某处定义,则会发生链接器错误。

    【讨论】:

      【解决方案2】:

      是的,这是正确的。正是这一特性使得将一个大程序拆分为多个源文件成为可能。

      【讨论】:

        【解决方案3】:

        函数声明和函数定义有很大的不同。要使用函数,必须先声明函数,但必须定义所使用的函数才能编译程序。

        C 编译过程是一系列步骤,将一个步骤传递给另一个步骤。在典型的编译过程中,首先运行预处理器,然后编译器为每个源文件生成汇编语言,然后汇编器将该汇编语言转换为机器代码,然后链接器将所有必要的部分放在一起。除非您声明函数,否则编译器步骤通常不会完成,但编译器并不关心函数的实际实现位置 - 它只是生成带有漏洞的汇编语言代码,可以在其中放置对实际函数的调用。链接器通过调用实际函数来填补这些漏洞。

        因此,您可以声明一个函数,但在另一个文件中定义它,这可能是本教程所做的。但是,您仍然必须在 somewhere 中定义函数,否则您将无法获得完整的可执行二进制文件。

        【讨论】:

          【解决方案4】:

          是的,有一种叫做链接的东西。这是一个解析对不同符号(如变量、函数等)的引用的过程。即使编译器对函数的定义一无所知,它也很高兴。但是,如果编译器知道函数的原型,它可以检查函数是否正确使用,以便及早标记错误。

          请参阅Wikipedia 或 google 以了解有关链接的更多信息。

          【讨论】:

            猜你喜欢
            • 2017-01-03
            • 1970-01-01
            • 1970-01-01
            • 2014-10-12
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多