标题与静态图书馆

时间:2015-08-04 15:09:01

标签: c static-libraries header-files

我打算在其他项目中使用一些实用程序代码,但我怀疑它是否是一个主要是标题的代码,一个带有标题的静态库只是暴露界面或介于两者之间。大多数代码都是包含其他标准函数的简单函数,但也会有更大的函数。

我想我大多理解标题方法和静态库方法之间的区别:

标题:

  • 所有代码都在标题中
  • 编译器内联代码的更好机会
  • 每次使用时都必须编译每个函数

对于静态库:

  • 库和标题之间的混合代码
  • 编译器内联代码的机会更糟糕
  • 编译一次并忘记

我一直在看一些代码而且我已经看过两种方法,但我不知道哪种方法会更好。有什么想法吗?

4 个答案:

答案 0 :(得分:1)

通常可以编写标题,以便宏可用于有条件地包含整个库(用于在一个单元中编译)仅声明(用于链接静态/共享对象或编译)单独的单位)由用户选择。使用这样的宏具有额外的好处,假设存在单独的库源和/或对象,则可以将选择推迟到编译之前并由构建工具控制。这样做的一个明显的缺点是它可以使你的代码完全混乱,以及使用宏进行条件编译所带来的所有复杂性和认知压力。

是否任何给定选项(header / header + source / static-lib / shared-lib / etc。)是合适的,或者上述选项是否有用,或者是否可能,取决于你正在做什么。

答案 1 :(得分:1)

我更喜欢把它写成静态库,而不是使用标题。

  • 如果您使用标题,它将在代码中内联,这会使代码大小变大(如果您使用嵌入式系统,则这是一个缺点)
  • 编译整个内联函数需要更多的编译时间
  • 但内联在调用函数时节省了上下文切换的时间,但这只会在几微秒的范围内(考虑到使用头方法时代码大小的代价)
  • 通过标头方法实现某些功能很困难且更容易出错,请参阅:https://gcc.gnu.org/onlinedocs/cpp/Macro-Pitfalls.html
  • 组件/开发板制造商生产的所有标准库都是静态库方法

答案 2 :(得分:0)

除非这些函数是一行或两行,否则我认为将实现与声明分开(使用静态库)会更好。

  1. 如果每次更改文件时都需要重新编译相同的稳定代码,那么就是在浪费时间。

  2. 内联函数除非您经常使用它们,否则不会提供大量的速度提升。此外,编译器是否可以自行决定内联声明的内联函数。

答案 3 :(得分:0)

我通常的方法是单独在头文件中加入签名和文档(简要解释每个函数的功能),并将代码编译成静态(或共享)库。

通过这种方式,您可以将预编译的库和标题一起发布,这样可以为客户(甚至是将来的健忘者)提供一种检查函数功能的简便方法,而无需跳过实现。 / p>

这将是我的建议。但是,C语言并没有强加这种行为,这完全取决于程序员。