使用 .cpp 文件代替头文件(.h)

24

有些情况下,我们会包含 .cpp 文件而不是标准的头文件(.h),例如:

#include "example.cpp"

取代

#include "example.h"

这看起来可以工作,但这是否安全?或者我应该避免使用它?

编译时间怎么样?


1
它的安全性取决于你的操作。通常情况下不应该需要这样做。编程不是盲目地跟随某些规则,而是要理解你所做的事情,并基于理解和推理做出决策。 - Kerrek SB
1
我曾经看到的唯一有效的理由是为了节省链接时间。这里解释了Unity Build - Ben Voigt
1
@sysop:正如我所说:首先要理解你正在做什么和询问什么。包含文件是由预处理器在编译之前处理的。了解预处理器,你就会知道何时可以安全地包含文件。 - Kerrek SB
4个回答

22

这是懒惰的编码方式。使用头文件来代替。是的,它们可能会增加编译时间,但它们意味着您可以轻松地重新实现代码块,或者更好的情况是,另一个开发人员随时可以接手。头文件作为您的 C/C++ 代码将要执行的模板。丢弃或忽略它是一个坏主意。


我一直使用.h文件,但我们这里有很多争议,所以我想问一下。 - sysop
2
@sysop -- 说实话,“这是懒惰的编码”有点夸张。在某些情况下,这可能确实是正确的做法,但通常情况下,我认为这是不好的形式。 - zellio
8
е°Ҷ.hж–Ү件еҢ…еҗ«еңЁд»Јз ҒдёӯиҖҢдёҚжҳҜ.cppж–Ү件еҸҜд»Ҙжҳҫи‘—еҠ йҖҹзј–иҜ‘ж—¶й—ҙпјҢеӣ дёәе®ғдҪҝеҫ—иҝӣиЎҢйғЁеҲҶйҮҚж–°зј–иҜ‘жҲҗдёәеҸҜиғҪгҖӮ - tom

8

我同意Kerrek SB的观点。

我曾经做过这件事情。我正在构建一个优秀的、广泛使用的压缩库,需要为8位图像和12位图像分别构建。我能想到的最清晰的方法是(有些简化),有两个主.cpp文件,一个设置8位构建的#define,另一个设置12位构建的#define。然后主.cpp文件#包含压缩库的源文件。

如果你足够理解规则并知道规则的原因及其在你的情况下可能不适用的原因,那么不遵循一般规则是可以的。但这种情况应该很少见。


3

#include "impl.cpp" 有其合理的应用场景:

  1. 测试对静态/等变量的访问权限

  2. 使用临时模板,如果 C++ 模板机制不足以满足需求(很少情况下)

    #define MACRO (...)

    #include "impl.cpp" // 使用 MACRO

需要注意的是,如果同一个文件被包含在多个编译单元中并最终链接在一起,则 #include "impl.cpp" 可能会不安全。


1

我以前用过它并没有问题,但我不能保证它是安全的。有时这是我的唯一选择,所以我使用它,否则我会使用 .h 文件。


总有另一种选择,也就是永远不要说“从不”。 - LihO

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接