3

在 C++ 中,在“主”文件中包含类文件头的约定是什么。例如

myclass.h 

class MyClass {
  doSomething();
}


myclass.cpp

  doSomething() {
      cout << "doing something";
  }


run.cpp

#include "myclass.h"
#include "myclass.cpp"

etc..

这是比较标准的吗?

4

6 回答 6

3

您不包含 .cpp 文件,仅包含 .h 文件。.cpp 中的函数定义将被编译为 .obj 文件,然后将链接到最终的二进制文件中。如果将 .cpp 文件包含在其他 .cpp 文件中,则会编译出两个具有相同功能定义的不同 .obj 文件,这将导致链接器错误。

于 2009-02-12T05:24:20.510 回答
1

请参阅Understanding C Compilers以获得这个问题的很多好的答案。

于 2009-02-12T05:22:49.500 回答
1

您可以说一个 .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 ...
于 2009-02-12T05:30:57.200 回答
0

通常您单独编译 .cpp 文件并将生成的 .o 与其他 .o 链接

所以 myclass.cpp 将包含 myclass.h 并将被编译为一个单元。

于 2009-02-12T05:22:59.093 回答
0

您单独编译 cpp 文件。如果您将任何给定的 cpp 文件包含在两个或多个 cpp 文件中,那么您可能会在链接阶段遇到冲突。

于 2009-02-12T05:26:03.190 回答
0

您不能在另一个 *.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,然后让“链接器”将它们组合成一个可执行文件。

于 2009-02-12T05:27:30.173 回答