【问题标题】:Are function prototypes needed in header files?头文件中是否需要函数原型?
【发布时间】:2014-08-20 04:18:48
【问题描述】:

我在 robotsc 中编程,这只是带有插件的 c 编程(遵循所有 c 规则)。为了组织我的代码,我将子例程放在头文件中,并从我的主 c 文档中引用。我是否仍然可以从 c 文档中引用头文件中的方法而不将函数原型放入 标题?

例如:

main1.c 中的代码

    #include header1.h
    task main()
    {
      header_method();
    }

header1.h 中的代码(无函数原型)

   header_method()
   {
   //do stuffs
   }

或者我必须这样做:

   void header_method();

   header_method()
   {
   //do stuffs
   }

原因是我在robotc中只能为我的机器人声明一定数量的全局变量。

【问题讨论】:

  • 我看不出原因有什么关系。函数原型不是“全局变量”...
  • 我想我措辞错误。 Robotc 限制了我可以使用的函数原型的数量。
  • 为什么ROBOTC 会施加这样的任意限制?免费试用下载是否有限制?如果是这样,您可能不得不做一些丑陋的事情来解决这些限制(或为完整版付费)。确切地知道限制是什么会有所帮助。
  • 其实基思,我有完整版。我相信robotC wiki 说ROBOTC 强加了限制,因为机器人无法处理它。我不记得确切的限制,但它是 200 个全局变量。
  • 函数原型不是全局变量。

标签: c function header


【解决方案1】:

您应该(几乎)永远不要将函数 定义 放在头文件中,就像您在 header1.h 中所做的那样。

头文件应该包含函数声明(原型)。

(“原型”是指定参数类型的函数声明。有些非原型函数声明不指定参数类型,但它们已经过时,没有理由使用它们。)

函数定义(带有实现该函数的{ ... } 代码)应该在.c 文件中。

每个.c 文件都应该有一个#include 指令,用于它调用或定义的任何函数。

并且每个头文件都应该被include guards保护以免被多次包含。

这个想法是每个函数声明在每个翻译单元(您编译的每个源文件)中只出现一次,并且每个函数定义 在整个程序中只出现一次。

如果你有一个函数只在一个.c 文件中使用,你可以将它的声明和定义放在同一个.c 文件中(你应该将它定义为static)。事实上,如果定义出现在任何调用之前,您可以省略单独的声明;定义本身就是一个声明。

(定义为inline 的函数会使这个模型稍微复杂一些;我建议暂时不要担心。)

【讨论】:

  • 所以将函数原型放在头文件中?正确的?因此,我通过声明函数、使用 #include 实现它们并在 main.c 代码中定义方法操作,将标头用作 OOP 中的抽象接口。
  • @KiroYakuza:是的,我相信我就是这么说的。更重要的是,不要将函数定义放在头文件中。
  • 内联链接已损坏 - 没有足够的字符来建议
猜你喜欢
  • 2020-12-10
  • 1970-01-01
  • 1970-01-01
  • 2017-12-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-18
  • 1970-01-01
相关资源
最近更新 更多