我还有一个包含实现的小标题。将它编译为对象并将其与其他源链接起来是否很好? ......如果它有模板功能怎么办??
答案 0 :(得分:2)
当标题的内容#include <yourheader>
时,标题的内容将完全包含在源文件中,并且代码将作为包含翻译单元的一部分进行编译。所以不,没有理由将头文件编译为自己的目标文件/翻译单元(因此没有理由将其明确链接)。
答案 1 :(得分:1)
将它编译为对象并将其链接到其他来源是否合适?
不,你不应该单独编译头文件。
如果这些包含函数实现,您可以标记这些static inline
以避免违反ODR。否则,请考虑将实现分成另一个翻译单元。
......如果它有模板功能怎么办?
在这种情况下,您需要在头文件中提供实现。
答案 2 :(得分:0)
这取决于你想要达到的目标。我曾经有一个嵌入式处理器的编译器,它没有包含链接器。为了让我的代码分布在几个文件上,我不得不#include .c文件。在这种情况下,使用#ifndef FILENAME_C / #define FILENAME_C保护以避免多次包含它仍然非常重要。
换句话说,对于编译器,如果在.h或.c文件中实现某些代码并不重要。它所看到的只是预处理器的输出,使用#includes来生成编译器理解的东西是你的工作。