如果我把.cpp剪切粘贴到.h的底部,一切都会一样吗?

Will everything work the same if I cut and paste my .cpp to the bottom of my .h?

本文关键字:一样 cpp 如果 底部      更新时间:2023-10-16

我有一个非常简单的类,我想把它合并到一个。h文件。如果我把。cpp的核心部分剪切粘贴到。h的底部,一切还会一样吗?

特别地,在.cpp顶部的任何类定义之外都有静态成员变量初始化int MyClass::myStaticVar = 0;,然后是静态成员函数实现void MyClass::myStaticMethod() {...}。一些非静态成员函数已经在。h中实现了,而不是在。cpp中。所以你可以看到这里有一些细微的差别,我想澄清一下。


编辑到目前为止,我得到的是:

这是顽皮的,但它将工作,如果你只#include .h一次。它打破了惯例,不像。h那样工作,所以它可能会也可以被命名为。笨蛋。

现在,以TUIO c++绑定为例。许多类由一个.h文件组成,没有cpp (tuiocpoint .h、tuiocursorh、tuiocobject .h等)。

如果您在整个项目中留下单个cpp文件,那么它将工作(但这是糟糕的做法)。如果你有两个cpp文件都包含那个头文件,你就违反了一个定义规则,你(应该)得到链接器错误。

可以这样做,如果(A)所有函数都是模板(事实上,在这种情况下,您必须),或者(B)所有函数都标记为inline

[编辑]您还没有遇到问题的原因是在类定义中定义的函数自动标记为内联。因此:没有问题。但是,如果函数是在类定义之外定义的,它应该在cpp文件中。此外,静态成员应该始终位于cpp文件中。

[Edit2]非inline,非template函数和文件范围变量(全局和静态成员)应该总是在cpp文件中的原因是,当编译器发现那行代码时,它会在那里创建函数/变量。显然,它必须创建一次才能使用。为什么不在头文件中呢?因为如果头文件包含在两个cpp文件中,那么它将在两个地方创建(我正在工作的hpp文件实际上包含在数千个cpp文件中)。c++有一个"单定义规则",每个函数/对象只能定义/创建一次,以防止这种明显的错误:

int MyClass::myStaticVar = 0;
int MyClass::myStaticVar = 7;

它会使用哪个?您刚刚创建了两个具有相同名称的变量!所以这是不允许的,即使它们完全相同,(除了内联/模板)。每个cpp文件只编译一次(除非因为一些奇怪的原因,它是从其他地方编译的include),这可以防止意外违反单定义规则。另外,hpp文件用于声明,cpp文件用于定义/实例化。

h文件还有什么用?你不能有多个。cpp文件#包括这个。h文件。如果这个。h只包含在一个。cpp中,那么为什么首先需要。h文件—只需将所有内容放在。cpp中。

除了Mooings的答案,您可能需要考虑编译/链接过程一段时间。

  • 编译器编译。cpp文件,而不是。h文件(按照约定)。

这样做的结果是,对于每个.cpp文件,您都需要为所引用的类定义,以便为.cpp中的代码创建指令。h文件提供了这一点。

你不希望在你的程序中重复相同的代码片段,这将是编译.cpp文件的结果,包括头文件和实现(你所建议的);因此一个定义规则

在一个.cpp文件项目中,正如Mooing建议的那样,您当然可以随意使用,只要您有一个带有main且只有一组包含的.cpp。

本质上,这就是#include所做的(它将标题粘贴到cpp中,基本上在某种意义上做同样的事情)。所以,是的,假设没有奇怪的情况,一切都应该很好。我不明白你为什么要这么做。最好在类定义中直接定义函数之类的东西,或者只使用#include。你为什么不这么做?

编辑:回答你的编辑,为什么你在头中实现成员?我建议将它们移到.cpp中,除非这是一个模板类或一些类似的特殊情况。使用头文件进行原型和声明,使用cpp进行定义。这应该能解决你所有的问题。