我想知道为什么推荐的方式是#include<example.hpp>
中的example.cpp
;我不明白,预处理器(这似乎是一个非常简单的程序)如何知道方法的定义在example.cpp
中 - 该文件的名称不会出现在main.cpp
中包含文件example.hpp
。 AFAIK,#include<filename>
只需使用filename
的内容替换。
我总是反映情况 - 我#include<example.cpp>
example.hpp
。然后,包括example.hpp
在内的预处理器也包括example.cpp
。
答案 0 :(得分:2)
如果预处理表单(预处理后)是有效的C ++,您可以在{+ 1}} C ++翻译单元(您正在编译的#include
)中的任意文件。阅读preprocessor和C 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 ++标准中并未被接受,但类似的东西可能或许在未来变得标准化。