C++中头文件和cpp文件的惯例是什么?

3
在C++中,将类文件的头文件包含在“主”文件中的惯例是什么?例如。
myclass.h 

class MyClass {
  doSomething();
}


myclass.cpp

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


run.cpp

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

etc..

这是比较标准的吗?
6个回答

3

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


1

请参考理解C编译器,该网站提供了许多关于这个问题的好答案。


我同意医生! 另外,这个也很有用: https://dev59.com/hUbRa4cB1Zd3GeqP1IMw#533201 - bobby

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 ...

我可能错了,但我认为这个类在两个单元中都被声明,而只在一个单元中被定义:*.h文件包含了该类的声明,而*.cpp文件包含了该类的定义 - ChrisW
不,它不包含定义。cpp文件包含的是成员函数/静态成员的定义。但类定义放置在头文件中(类的声明只是“class foo;”,而定义可能是“class foo { };”)。 - Johannes Schaub - litb

0
通常你要分别编译.cpp文件,然后将结果为.o的文件与其他的.o文件链接起来。
所以myclass.cpp会包含myclass.h并且被作为一个单元进行编译。

0

你需要单独编译cpp文件。如果你将某个cpp文件包含到两个或更多的cpp文件中,可能会在链接阶段遇到冲突。


0

不要在一个 *.cpp 文件中嵌套另一个 *.cpp 文件。取而代之的是:


myclass.h

class MyClass {
  doSomething();
}

myclass.cpp

#include "myclass.h"

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

run.cpp

#include "myclass.h"

etc..

不要将myclass.cpp包含在main.cpp中(这样编译器会在一次通过中看到它们两个),而是分别编译myclass.cpp和main.cpp,然后让“链接器”将它们组合成一个可执行文件。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接