【问题标题】:Why are C++ header functions put in a seperate file?为什么 C++ 头函数放在单独的文件中?
【发布时间】:2016-08-10 06:15:32
【问题描述】:

我正在学习 C++ 教程,在一篇关于预处理器/头文件的文章中,作者创建了 2 个“头文件”(当然不是技术术语),example.h 和 example。 cpp。在 example.h 中,他提出了函数和标头保护的前向声明,在 example.cpp 中提出了函数的实际主体。为什么是这样?我尝试将函数的主体放在 example.h 文件中,它工作得很好,那他为什么要把它分开呢?这是习惯性的,还是会在更大的问题中造成问题?还是什么?

有人可以请教我吗...

【问题讨论】:

  • #include 相当于将文件的内容复制并粘贴到您的代码中
  • 所以...可以有多个声明,但不能有定义?
  • 好的,现在更有意义了

标签: c++ header-files


【解决方案1】:

C++ 有一条称为单一定义规则的规则,它表示每个函数只需要定义一次(此规则有一些例外,但我们将忽略它们现在。)通常包含在头文件中的函数原型是一个声明,表示该函数存在,.cpp 文件中的实现是给出代码的定义函数。

如果您将函数的定义放在头文件中,然后在多个位置包含该头文件,您将收到链接器错误,因为您违反了一个定义规则 - 编译的每个 .cpp 文件都会有其函数定义的自己的副本。另一方面,如果您只是将 declaration 放在标题中,然后将 definition 放在单个源文件中,那么只有一个定义,不会有任何问题。

单一定义规则有一些例外。首先,所有内联函数都免于 ODR,因此如果您将所有函数标记为 inline,您可能会将函数定义放在头文件中,尽管对于除最小函数之外的所有函数,这通常不是一个好主意。其次,模板函数不受 ODR 影响,这(除其他外)是您在标题中看到模板函数定义的原因之一。

【讨论】:

  • 什么是内联函数和模板函数?
  • @wolf_adventures1909 我认为我无法在此评论的空白处解释它们。查找 inline 关键字以了解内联函数的说明。对于模板函数,您可能希望在 Google 上查找“C++ 模板”之类的内容。狩猎愉快!
  • 感谢您的帮助,非常有用,我当然会查一下 ;)
【解决方案2】:

将函数体放在example.h中。然后,当您编写第二个包含 example.h 的 .cpp 文件并将其与 example.cpp 链接时,您将收到链接器错误。链接器将在 example.h 中看到该函数的 2 个定义。

【讨论】:

  • 不知道我是否理解......但是,结构将是这样的: main.cpp 包括 example.h 和 example.cpp 其中还包括 example.h 导致 exampleFunc() 的两个实例在 main.cpp 中?还是在编译时它们会自动链接(不包含)?
  • 对,导致在 a.out 中出现两个 exampleFunc() 实例(或任何输出二进制文件的名称。)
【解决方案3】:

因为在头文件中您只声明了在您想要使用自定义链接配置时非常重要的函数。例如,如果一个函数在一个文件对象中定义并在另一个对象中使用,则链接器必须对该函数具有相同的引用才能链接两个不同的文件。

【讨论】:

    猜你喜欢
    • 2018-06-01
    • 2023-03-15
    • 1970-01-01
    • 1970-01-01
    • 2019-04-07
    • 1970-01-01
    相关资源
    最近更新 更多