如果我把.cpp剪切粘贴到.h的底部,一切都会一样吗?
Will everything work the same if I cut and paste my .cpp to the bottom of my .h?
我有一个非常简单的类,我想把它合并到一个。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进行定义。这应该能解决你所有的问题。
- .cpp和.h文件中的模板专用化声明
- 为什么两个不同的未命名名称空间可以共存于一个cpp文件中
- Linux的Cpp上的计时器
- 如何运行位于boost/libs/python/example/tutorial目录中的hello.cpp和Jamfil
- 命名空间中具有.h和.cpp文件的类
- 内置函数可查看CPP中的成员变量
- 无法编译 rtmidi 测试 cmidiin.cpp 文件, 非法指令
- Cpp-Tuple使用带有变量的get
- C++-试图将函数指针推回到另一个CPP文件中的矢量时出错
- 有充分的理由在h文件中使用include保护而不是cpp文件吗
- 如何通过cpp程序运行shell脚本
- 使用2个键的cpp-stl::优先级队列排序不正确
- cpp二进制搜索问题,计算给定数组中输入元素的出现次数
- 如何在cpp文件之间切换窗口?在Qt中
- 在 .h 文件中的类中声明静态变量和在.cpp文件中声明"global"变量有什么区别
- 像 CPP 中的控制台一样的应用程序
- 是否可以像txt文件一样读取cpp文件
- 如果我把.cpp剪切粘贴到.h的底部,一切都会一样吗?
- c++标准和C语言在哪里说的是一样的:编译单元(.cpp文件)中的变量是按照声明的顺序初始化的
- 从vi运行各种c或cpp开发任务"就像在不退出vi的情况下运行cpp程序一样。