我什么时候需要#include .cpp 文件?

When do I need to #include .cpp files?

我的一个作业涉及三个文件:LineType.h、LineType.cpp和Driver.cpp。 Driver.cpp 包含 main() 方法,该方法使用由 LineType.h 和 LineType.cpp.

定义的 class

在我的系统上,Driver.cpp 开头为:

#include "LineType.h"
#include "LineType.cpp"
#include <iostream>

当我通过命令行从项目目录中 运行 g++ Driver.cpp 时,程序编译并 运行 完美。但是,当我的讲师尝试编译该程序时(我相信她使用的是 Eclipse),它无法编译。经过一些来回,她能够通过注释掉来自 Driver.cpp:

的#includes 之一来最终解决问题
#include "LineType.h"
//#include "LineType.cpp"
#include <iostream>

当我试图在这个编辑过的文件上 运行 g++ Driver.cpp 时,我的编译器抱怨 "Undefined symbols for architecture",我的理解是它找不到 [=25= 的定义] 被调用。

我和我的导师做了哪些不同的事情导致了这种行为上的差异?为什么我的编译器需要的一行导致她的编译器失败?

您应该永远不要直接包含源文件。

相反,您应该在编译时在 g++ 命令中列出所有源文件:

g++ Driver.cpp LineType.cpp MyOtherFile.cpp # etc...

使用 #include somefilename 意味着 somefilename 的内容代替了 include.
通过将 #include "LineType.cpp" 放入 Driver.cpp 文件中,您可以有效地将所有内容放入一个文件中,然后使用 g++ Driver.cpp 进行编译对您来说效果很好。
当您的讲师使用 IDE 进行编译时,它会进行单独的编译和 linking。因此它编译了 Driver.cpp 和 LineType.cpp 这两个文件都包含来自 LineType.cpp 的定义。所以当谈到 linking 时,她在 LineType.cpp 中定义了两次,linker 不知道该怎么做。 您可以使用

一次编译和 link 多个文件
g++ Driver.cpp LineType.cpp 

或者使用单独的编译和 linking 命令

g++ -c Driver.cpp
g++ -c LineType.cpp

这将生成文件 Driver.oLineType.o。然后你可以通过 运行

将它们组合在一起
g++ Driver.o LineType.o

我个人强烈不推荐 include 源文件。 但是这个 article 的作者声称包含源文件可以减少订单中大型项目的编译时间。他称此为“统一构建”,并声称该方法广泛应用于游戏行业。 unity build 的主要思想是减少编译中的模块数量。像这样:

my_unity_build_1.cpp:

#include "renderer.cpp"
#include "ui_elements.cpp"
#include "gameplay_code.cpp"
#include "character_AI.cpp"

my_unity_build_2.cpp:

#include "file_io.cpp"
#include "cat_dynamics.cpp"
#include "wobbly_bits.cpp"
#include "death_ray.cpp"

更少的模块意味着更少的重复通用函数和更少的代码生成。 Modules 允许显着减少编译时间,但仍然不符合标准。