【问题标题】:Declaration of functions is not needed in case of the function being written above the main function.Why?如果函数写在主函数之上,则不需要函数声明。为什么?
【发布时间】:2014-02-17 16:24:00
【问题描述】:

在main函数之前写函数体而不声明运行正确。但是在main函数之后写函数体需要显式声明函数。为什么?

【问题讨论】:

  • 编译器从上到下工作。如果它发现对尚未定义或没有原型的函数的调用,它将不知道您是否正确调用了该函数。
  • 一个人可以从过去学习,但一个人无法预见未来。这适用于生活和编译器
  • ... 是不是有点太哲学了?
  • @EdHeal 你现在是我的导师。 ;-)
  • @FiddlingBits - 别那样做 - 你可能会失明 :-)

标签: c function pointers declaration


【解决方案1】:

在到达调用点时,在从编译单元的第一个字节开始到最后一个字节的文本扫描中,必须知道任何调用函数的类型。这意味着在其调用站点之前定义的任何函数(这也声明了该函数)都可以。

【讨论】:

    【解决方案2】:

    定义就是声明。

    当你在调用之前定义函数时,你也在声明它。

    在调用函数时,它的声明应该在之前出现。定义满足这一要求。如果定义在调用后出现,则调用前必须有单独的声明。

    【讨论】:

    • 尽管我通常同意,当您将 -Wmissing-declarations 参数传递给您的 GCC 时,您会得到相反的结果。
    【解决方案3】:

    因为编译器从上到下处理文件的方式。

    一个函数在遇到它时会为编译器所知,因此其主体在文件中的使用之上编写(也称为定义)的函数是编译器已知的并且不会触发错误,而那些在使用后定义的函数触发这样的错误。

    然而,依赖函数声明顺序是不好的做法。您应该使用头文件。

    【讨论】:

      【解决方案4】:

      因为,C 是一种自上而下的方法。这适用于“功能分解”概念。因此,它在第一种情况下将定义作为声明,如下所示:

          void  display()
          {
          printf("hai");
          }
          void main()
          {
          display();
          }
      

      但是,在第二种情况下,编译器在解析时搜索声明。

      【讨论】:

        猜你喜欢
        • 2011-06-13
        • 2010-09-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-06-27
        • 1970-01-01
        • 2011-07-03
        相关资源
        最近更新 更多