C / C ++前向声明与包含

时间:2011-10-21 23:11:26

标签: c++ header include forward-declaration

当你包含一些文件时,当你转发声明一些函数/类时会发生什么?如果两个文件包含相同的文件将第一个成功读取所有函数第二个将失败但仍然能够使用函数??

当我转发声明某些功能时会发生什么?这个功能现在“保存”了,我可以在任何地方使用它,或者只知道同一个文件?那么为什么带有include的两个文件(带有警卫的文件)会起作用?

我可以在主要内容中包含所有内容并且不再费心吗?

修改

为什么cpp文件应该包含它们的标题?如果我不包括它们怎么办?

3 个答案:

答案 0 :(得分:4)

  

当你包含一些文件时,当你转发声明一些函数/类时会发生什么?

当您包含文件时,预处理器会将其内容“复制并粘贴”到包含源中。当您转发声明一个函数/类时,您声明一个不完整的类型,让翻译单元的其余部分知道存在具有该名称的函数/类,并使其在允许不完整声明的上下文中可用。

  

如果两个文件包含相同的文件,第一个成功读取所有函数第二个将失败但仍能使用这些函数吗?

如果包含的文件包含正确的include guards,则同一翻译单元中的第二个包含将实际上是无操作。如果两个不同的源文件包含相同的头文件,则完整内容将包含在两个文件中。

  

当我转发声明某些功能时会发生什么?这个功能现在“保存”了,我可以在任何地方使用它,或者只知道同一个文件?那么为什么带有include的两个文件(带有警卫的文件)会起作用?

该功能只能在包含前向声明的翻译单元中使用。通常,每个源文件(.cpp)是不同的转换单元,宏定义(标题保护的定义)以及声明/定义在该转换单元内是有效的。标题保护防止同一个头文件在同一个翻译单元中被多次包含,以防止多个声明错误。

答案 1 :(得分:0)

简短回答: 转发类/函数允许编译器实际上不必编译整个类/函数,除非需要。

答案很长: 转发类/函数就像声明一个类/函数而不定义它一样。您承诺稍后会定义它,但是现在您只想通知编译器它存在。您通常在头文件中执行这些正向减速。这通常会导致更快的编译时间,因为在包含您的标头的.cpp文件中,只有那些实际需要您转发的类并包含它的相应头文件才需要实际编译包含类的代码。

答案 2 :(得分:0)

  

当您包含某个文件以及正在发生的事情时,会发生什么   当你转发声明一些函数/类?

当您include文件时,预处理器会有效地复制将整个included文件粘贴到执行include的文件中。当你转发声明一个函数/类时,你告诉编译器它存在,但你不需要整个头文件。当你有循环依赖时,这是必需的,并且极大地减少了在其他地方的编译时间。

  

如果两个文件包含相同的文件,则第一个文件将成功读取   所有功能第二个将失败但仍然能够使用   功能??

如果同一个文件在一个翻译单元(.cpp文件)中被包含两次,则两者都将“成功”,但如果标题包含任何类型的保护,则第二次不会加载任何内容,因为预处理器已经将它“复制”到翻译单元中,并且第二次执行它会使所有内容重复,这将是一个错误。因此,所涉及的所有文件都可以使用到目前为止所包含的所有标题中的所有函数。

  

当我转发声明某些功能时会发生什么?这个功能   现在“保存”了,我可以在任何地方使用它,或者只知道相同的   文件?那么为什么带有include的两个文件(带有警卫的文件)会起作用?

是的,如果你在标题中转发声明一个函数/类,它可以被包含该标题的任何其他文件使用。

  

我可以在主要内容中包含所有内容并且不再费心吗?

可能。一旦你得到更复杂的例子,你将最终得到循环依赖,要求某些事情要按特定顺序声明和/或定义。除此之外,是的。您可以将所有内容都包含在main中并保持简单。但是,您的代码将需要FOREVER进行编译。

  

为什么cpp文件应该包含它们的标题?如果我不包括它们怎么办?

然后.cpp文件将不知道其他任何东西本身存在。不是很有用。