C/ c++前向声明vs. Include
C/C++ Forward declaration vs. Include
当你包含一些文件时发生了什么,当你向前声明一些函数/类时会发生什么?如果两个文件包含相同的文件,第一个将成功读取所有的函数,第二个将失败,但仍然能够使用这些函数??
当我向前声明某个函数时会发生什么?这个函数现在"保存",我可以在任何地方使用它,或者它只知道同一个文件?那么为什么两个带有include的文件(到一个带有守卫的文件)可以工作呢?
我可以把所有的东西都包含在main中,不再麻烦了吗?
编辑:为什么cpp文件应该包含它们的头文件??如果我不包括他们呢?
当你包含一些文件时会发生什么,当你向前声明一些函数/类时会发生什么?
当你包含一个文件时,它的内容被预处理器"复制并粘贴"到包含源文件中。当你向前声明一个函数/类时,你是在声明一个不完整的类型,让翻译单元的其余部分知道存在一个具有该名称的函数/类,并使其在允许不完整声明的上下文中可用。
如果两个文件包含相同的文件,第一个将成功读取所有的函数,第二个将失败,但仍然能够使用这些函数?
如果包含的文件包含了适当的包含保护符,那么在同一翻译单元中的第二次包含将是无效的。如果两个不同的源文件包含相同的头文件,则完整的内容将包含在两个文件中。
当我向前声明某个函数时会发生什么?这个函数现在"保存",我可以在任何地方使用它,或者它只知道同一个文件?那么为什么两个带有include的文件(到一个带有守卫的文件)可以工作呢?
该函数只能在包含forward声明的翻译单元中使用。一般来说,每个源文件(.cpp)都是一个不同的翻译单元,宏定义(头警卫的那些)以及声明/定义在该翻译单元中有效。头文件保护防止同一个头文件在同一个翻译单元中被包含多次,以防止多次声明错误。
当你包含一些文件时发生了什么,发生了什么当你向前声明一些函数/类?
当您include
a文件时,预处理器有效地将整个included
文件复制粘贴到执行include
操作的文件中。当您转发声明一个函数/类时,您是在告诉编译器它存在,但您不需要整个头文件。当你有循环依赖时,是必需的, and 在其他地方大大减少了编译时间。
如果两个文件包含相同的文件,第一个文件将读取成功所有的功能,第二个将失败,但仍然能够使用功能? ?
如果相同的文件在一个翻译单元(.cpp
文件)中包含两次,那么两者都将"成功",但如果头文件包含任何类型的保护,第二次不会加载任何内容,因为预处理器已经将其"复制"到翻译单元中,并且第二次这样做会使所有内容重复,这将是一个bug。因此,所有涉及的文件都可以使用所有头文件中的所有函数。
当我向前声明某个函数时会发生什么?这个函数是现在"保存"了,我可以在任何地方使用它,或者只知道它是一样的文件吗?那么为什么两个带有include的文件(到一个带有守卫的文件)可以工作呢?
是的,如果你在头文件中转发声明一个函数/类,它可以被包含该头文件的任何其他文件使用。
我可以把所有的东西都包含在main中,不再麻烦了吗?
。一旦遇到更复杂的例子,就会遇到循环依赖关系,要求以特定的顺序声明和/或定义某些东西。除此之外,是的。您可以在main中包含所有内容并保持简单。然而,你的代码将花很长时间来编译。
为什么cpp文件应该包含它们的头文件??如果我不包括他们呢?
那么.cpp
文件将不知道它自身之外存在任何其他东西。不是很有用。
简短的回答:转发类/函数允许编译器实际上不必编译整个类/函数,除非需要。
长答:转发一个类/函数就像声明一个类/函数而不定义它。您承诺稍后定义它,但现在您只想通知编译器它存在。通常在头文件中执行这些正向减速。这通常会导致更快的编译时间,因为在包含头文件的.cpp文件中,只有那些实际需要您转发的类并包含适当的头文件的文件才需要实际编译包含类的代码。
- .cpp和.h文件中的模板专用化声明
- 在VS代码中交叉编译Windows与Linux上的MinGW的SDL程序
- 未在作用域中声明unordered_map
- C++不正确,不需要重新声明类成员变量 MFC 手工解决方案/项目 MS VS 2015
- CLANG VS GCC 模板子类在父级中使用前向声明的类
- Clang(OS X)要求在特定嵌套声明中"template"关键字,而VS禁止它
- PIMPL 成语 VS 前向声明
- C++函数模板专用声明和模板参数;无 vs. <> vs. <type>
- 传递的参数vs.变量声明
- __cdecl _unlock在声明指向指针的点抛出线程错误时与 VS C++ 2010 有问题
- c++ 11:显式实例化声明vs显式实例化定义
- VS 2012中的显式模板声明/定义
- 内联函数原型vs正则声明vs原型
- C/ c++前向声明vs. Include
- 无法在VS 14 CTP中使用auto声明lambda:类型为'void'的条件表达式是非法的
- 模板化类成员VS嵌套类前向声明
- OpenMP对性能的影响:私有指令vs.在构造中声明变量
- c++ include vs前向声明策略
- c++中的正向声明VS编译顺序错误,以避免包含递归标头
- 当场创建对象vs变量声明