繁体   English   中英

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

[英]C/C++ Forward declaration vs. Include

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

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

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

编辑:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM