为什么#include< .hpp>在.cpp中,不是< .cpp>在.hpp?

时间:2014-08-18 17:57:31

标签: c++ include c-preprocessor header-files

我想知道为什么推荐的方式是#include<example.hpp> 中的example.cpp;我不明白,预处理器(这似乎是一个非常简单的程序)如何知道方法的定义在example.cpp中 - 该文件的名称不会出现在main.cpp中包含文件example.hpp。 AFAIK,#include<filename>只需使用filename的内容替换。

我总是反映情况 - 我#include<example.cpp> example.hpp。然后,包括example.hpp在内的预处理器也包括example.cpp

1 个答案:

答案 0 :(得分:2)

如果预处理表单(预处理后)是有效的C ++,您可以在{+ 1}} C ++翻译单元(您正在编译的#include)中的任意文件。阅读preprocessorC preprocessor wikipage上的一些文档。不要忘记预处理是C或C ++编译器的第一阶段。 (从历史上看,它甚至是一个不同的进程*.cpp;由于性能原因,它现在位于编译器中。)

包含文件的名称无关紧要。传统上,您不希望将包含的文件命名为顶级翻译单元。这就是为什么人们通常不会/lib/cpp,而是像#include "example.cpp"#include "example.inc"(或#include "example-inc.cpp",特别是#include "example.def" 多次标题时)。例如,标准C ++库接受#include <map>

请参阅示例this answer,其中显示了一些包含的文件#include - d 多次(用于不同目的),或者在GCC源内树,file gcc/tree.def

当然,在同一个编译单元中,你不能#include几次任意 C ++文件(因为你不能有多个例如相同函数的定义)。

在实践中,使用例如#include获取翻译单元g++ -C -E foo.cc > foo.ii的预处理形式...然后使用寻呼机或编辑器查看预处理表单foo.cc

另请阅读some proposal on modules in C++。它在最新的C ++标准中并未被接受,但类似的东西可能或许在未来变得标准化。