在 C++ 中,在“主”文件中包含类文件头的约定是什么。例如
myclass.h
class MyClass {
doSomething();
}
myclass.cpp
doSomething() {
cout << "doing something";
}
run.cpp
#include "myclass.h"
#include "myclass.cpp"
etc..
这是比较标准的吗?
您不包含 .cpp 文件,仅包含 .h 文件。.cpp 中的函数定义将被编译为 .obj 文件,然后将链接到最终的二进制文件中。如果将 .cpp 文件包含在其他 .cpp 文件中,则会编译出两个具有相同功能定义的不同 .obj 文件,这将导致链接器错误。
请参阅Understanding C Compilers以获得这个问题的很多好的答案。
您可以说一个 .cpp 文件及其所有包含的标头构成一个翻译单元。顾名思义,一个翻译单元是独立编译的。然后,每个翻译单元的结果通常称为 file.o 或 file.obj,然后由链接器链接在一起,修复尚未解析的引用。所以在你的情况下你有
Translation Unit 1 = run.cpp: myclass.h ...
Translation Unit 2 = myclass.cpp: myclass.h ...
您的类定义将出现在两个翻译单元中。但这没关系。这是允许的,只要两个类的定义相同。但如果函数不是内联的,则不允许在两个翻译单元中出现相同的函数。非内联函数只允许在一个翻译单元中定义一次。然后,您让链接器获取每个翻译单元的结果,并将它们绑定到一个可执行文件:
Executable = mystuff: run.o myclass.o ...
通常您单独编译 .cpp 文件并将生成的 .o 与其他 .o 链接
所以 myclass.cpp 将包含 myclass.h 并将被编译为一个单元。
您单独编译 cpp 文件。如果您将任何给定的 cpp 文件包含在两个或多个 cpp 文件中,那么您可能会在链接阶段遇到冲突。
您不能在另一个 *.cpp 中包含一个 *.cpp。反而:
我的班级.h
class MyClass {
doSomething();
}
我的类.cpp
#include "myclass.h"
MyClass::doSomething() {
cout << "doing something";
}
运行.cpp
#include "myclass.h"
etc..
不是将 myclass.cpp 包含在 main.cpp 中(这样编译器会一次看到它们),而是分别编译 myclass.cpp 和 main.cpp,然后让“链接器”将它们组合成一个可执行文件。