【问题标题】:C header file usage and code reuseC头文件使用和代码复用
【发布时间】:2014-02-09 11:31:31
【问题描述】:

一些用于常见任务的 C 代码可能会在项目之间共享并保留以备将来使用。但是我应该如何保留它们?在 .c.h 中?我注意到 C 头文件 (.h) 通常只包含函数声明,而不包含定义,这似乎是推荐的做法。

  1. 声明定义放入mycode.h,这样我就可以简单地#include "myheader."并将所有工作留给编译器。

    李>
  2. 声明放入mycode.h,将定义放入mycode.c。可能符合约定?但是我每次都要编译链接mycode.c

最佳做法是什么?有什么建议?

编辑

每个人都说#2 是更好的做法。但是我如何告诉编译器定义/实现(.c/.o/.so?)在头文件中的位置?因为我只是#include 并使用 printf(...);?

【问题讨论】:

    标签: c header-files code-reuse


    【解决方案1】:

    最佳实践是第二种选择,因为它不仅简单,而且还涉及增强和维护

    【讨论】:

      【解决方案2】:

      选项 2 是最佳做法。为什么选项1不好?如果标头中存在定义,则这些定义具有 global 范围。它剥离了软件的模块化。限制变量的范围是一种很好的做法,因为软件单元的耦合较少,因此软件更易于维护。

      如果使用 make 系统,则只需编译已更改的 .c 文件。

      【讨论】:

      • 在选项 1 中只有 .h 文件需要编译,所以最后一个不是合乎逻辑的争论......
      【解决方案3】:

      创建一个库(.so 或 .dll - 你的毒药)然后链接到它

      然后头文件会告诉编译器什么是可用的

      【讨论】:

      • 我会编辑您的答案,将“(.so 或 .dll - 你的毒药)”替换为“动态或静态链接”。可以吗?
      • 可以是.lib - 但是,如果您想要静态或动态(动态听起来更性感吗?),请选择其中一个
      【解决方案4】:

      虽然不经常使用,但我见过在 .h 中包含大量代码的项目。如果您确定代码只会在一个项目中使用,我认为将代码放在标题中不会有很大的缺点,尽管这很不寻常。

      我建议将它放在 .c 中,以便能够将其编译为单独的模块或共享库。这将减轻其他开发人员的工作并提高可重用性。

      【讨论】:

        【解决方案5】:

        这实际上取决于您的项目之间要共享的文件数量。

        • 如果您有一个相互关联的文件集合,通常最好创建一个动态库或静态库,然后静态或动态地链接您的应用程序。

        • 一般 - 坚持 #2

        【讨论】:

          【解决方案6】:

          头文件是通往外部世界的窗口,这就是什么代码所做的(界面)。 它是如何做的(实现细节)是其他模块和项目真正不关心的。

          假设您拥有一家杂货店,而您的客户向您要了一打苹果。你: - 检查显示屏中是否有苹果。 - 如果没有,去后面的房间拿一些。 -如果苹果用完了,请告诉客户,并下订单恢复库存。

          但是,您的客户只想要他的一打苹果;不太关心他的订单细节。


          您可能会看到声明和定义位于同一个 .h 文件的情况。在使用 c++ 模板时,就我而言,这是强制性的。在其余情况下,它假设需要额外的构建时间,因为尽管自上次构建以来没有更改,但这些定义仍将被编译。

          【讨论】:

          • 谢谢!但是有什么方法可以告诉编译器定义/实现(.c/.o/.so?) 驻留在头文件中的什么位置?因为我只是 #include<stdio.h> 并使用 printf(...);?
          • stdio.h 例如​​属于 C 标准库。组成这个库的文件是“预先知道的”,因此您不需要将它们添加到您的项目中。您只需使用它们各自的 .h 文件调用它们。
          • 如果您使用第三方库,您可能会看到成对的 .h 文件和二进制输出文件(.lib、.dll)。通过将您的项目引用到这些输出文件,并使用提供的 .h 文件(为您提供访问功能的方法),您可以使用这些库。不同之处在于您无法访问实现细节(为了封装、构建方便、知识产权或所有这些......)
          【解决方案7】:

          使用第二个选项...或者创建库是动态的(.so)还是静态的(.a),这取决于你.. 是的,动态库大小比静态库要小。 所以第二个选项是最好的。

          【讨论】:

            猜你喜欢
            • 2017-07-28
            • 2023-03-22
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-02-05
            • 1970-01-01
            • 2019-07-31
            • 2012-03-10
            相关资源
            最近更新 更多