为什么c++头函数放在一个单独的文件中?
Why are C++ header functions put in a seperate file?
我正在学习c++教程,在一篇关于预处理器/头文件的文章中,作者创建了2个'头文件'(当然不是技术术语),example.h和example.cpp。在example.h中,他提供了函数的前向声明和头保护,在example.cpp中,他提供了函数的实际体。为什么会这样?我试着把函数体放在example.h文件中,它工作得很好,那么他为什么要把它分开呢?这是惯例,还是会带来更大的问题?还是别的什么?
c++有一个名为单定义规则的规则,该规则表示每个函数需要定义一次且仅定义一次(该规则有一些例外,但我们现在将忽略它们)。头文件中通常包含的函数原型是一个声明,表示函数存在,而.cpp文件中的实现是定义,给出函数的代码。
如果你把函数的定义放在一个头文件中,然后在多个地方包含这个头文件,你会得到链接器错误,因为你违反了一个定义规则——编译的每个.cpp文件都有它自己的函数定义副本。另一方面,如果您只是将声明放在头文件中,然后将定义放在单个源文件中,那么只有一个定义,并且没有任何问题。
对于一个定义规则有一些例外。首先,所有内联函数都免除ODR,因此如果将所有函数标记为inline
,则可能将函数定义放在头文件中,尽管除了最小的函数之外,这通常不被认为是一个好主意。其次,模板函数不受ODR的影响,这也是为什么在头文件中定义模板函数的原因之一。
将函数体放在example.h中。然后,当您编写第二个包含example.h的.cpp文件并将其与example.cpp链接时,您将得到一个链接错误。链接器将在example.h中看到该函数的两个定义。
因为在头文件中,只有当你想使用自定义链接配置时才声明真正重要的函数。例如,如果一个函数在一个文件对象中定义,并在另一个对象中使用,则链接器必须对该函数具有相同的引用以链接两个不同的文件。
- 我应该有 2 个单独的班级,一个用于"logic",一个用于"graphic interface"?
- 查询事件日志.如何查询才能单独获取第一个和最后一个事件?
- window.display() 单独在显示的最后一个缓冲区和当前缓冲区之间切换
- 我可以制作一个对象方法,如果单独调用,它将自行修改,但如果在复制初始化期间调用,则会返回一个新对象?
- 将一个随机的字符序列和int序列解析为单独的向量
- Howo 使用 cl 预处理为 masm 组装生成一个单独的文件
- 显示数组的问题.一切都放在一个单独的行中,但不放入单独的列中
- 我如何构建一个从git克隆的单独的增强库
- 如何将一个类的两个单独实例设置为彼此相等的 c++
- 如何在单独的线程上加载纹理到主内存并使用它在另一个线程上渲染
- 如何在这个交换函数(一个单独的链表)中找到错误
- 如何将正则表达式中组的每次迭代都作为一个单独的组
- 如何避免将两个单独的'>'格式化为一个班次?
- 如何从一个函数中获取2个单独的输出
- C#优雅地关闭一个没有UI的单独应用程序
- 如何将我的C++DLL包含在一个单独的项目中
- 哪个更好,一个类中的类或完全在单独的类中
- 将单独的数字转换为一个整数C++
- 如果我在C++中分配一个带有运算符 new[] 的对象数组,但单独释放它们是否仍然构成内存泄漏
- 为什么 setprecision( ) 在一个数字中给我两个单独的小数点