c ++中的源文件和标头

3 c++ header

我对c ++中的源文件和标题有疑问.

我有一个标题,用于声明函数.我在C++中实现这些功能.

现在我需要在其他文件中使用这些函数.我是否应该同时包含源文件和头文件才能使用这些功能?

sbi*_*sbi 8

因此,(C和C++)使用的基本编译模型是:

  1. 您将要在源文件之间共享的声明放入头文件中.然后,需要访问这些声明的源文件包含这些头文件.
  2. 编译时,预处理器将(递归地)将#include指令替换为包含的文件.结果称为编译单元.
  3. 然后,编译器将这些编译单元一次编译到目标文件中.(注意:编译器总是只看到一个翻译单元.它无法访问其他翻译单元中声明和定义的内容.)基本上,目标文件很容易编译代码,但所有对符号的引用(函数,变量)他们的编译单元之外仍然是象征性的.
  4. 然后,链接器将传递所有目标文件,并将对这些目标文件中的符号的引用链接到符号的定义,如果一切顺利,则吐出可执行文件.

在C++中,这在实践中通常有点复杂(特别是由于内联和模板,但也有链接时代码生成等功能),但这是基本原则.

其含义是:

  • 源文件通常只包含头文件.
    由于整个预处理器魔术只是一个简单的文本替换引擎而不知道(C或C++)及其在上述过程中的目的,因此可以弯曲和滥用来做其他事情.在这方面,包括源文件有时已经完成了一些目标.但这种情况很少见.
  • 符号可以按需声明,但必须只定义一次.
    如果链接器找不到已声明的符号(因此编译器已接受对它的引用),它将向您的脸部吐出一条令人讨厌的错误消息.如果它找到多个定义,它也会这样做.
  • 编译器不关心声明是来自预处理器包含的头还是直接写入源文件.
    但是,如果您将声明直接写入源文件,则编译器无法"查看"其他翻译单元,则无法警告您它们已过期.如果将声明放入头文件中,则更容易使它们与相应的定义保持同步,并且编译器通常甚至可以诊断它们是否不匹配.
  • 具有多个源文件的任何项目只能通过多个编译运行(每个源文件一个)构建,链接器将链接生成的目标文件.但是,IDE通常隐藏在项目管理之后.
    如果更改直接或间接在许多源文件中使用的标头,则必须重新编译大部分项目.如果更改源文件,则只需重新编译该源文件(当然,重新链接可执行文件).