ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

[C++] 前向声明(forward declaration)

2020-04-29 22:56:14  阅读:260  来源: 互联网

标签:Wheel 文件 Car C++ 前向 forward include 声明


1.前向声明只是一种“声明”

2.为什么前向声明在C++中是必要的

编译器想要确定没有拼写错误,并且传递给函数的参数也是对的,因此编译器要求在调用任何函数之前,必须首先看到该函数的声明。简而言之,任何变量或函数等,都是要求先声明再使用。

3.前向声明和定义之间的区别

函数声明需要提供返回类型,调用约定,方法名,参数以及参数类型,而定义要求有代码实现。

4.前向声明能显著缩短编译链接时间

通过使用 #include一些含有函数声明的头文件, 你可以将函数声明加到你的当前 .cpp文件或 .h文件中,然而,这会拖慢编译时间。尤其是如果在.h文件中#include 头文件时,这是因为,任何#include你写的.h文件的文件,结局是都将#include你所#include的头文件,编译器一下子需要编译无穷无尽的文件,即使需要调用的实际上只有一两个函数。
为了避免这种情况,你可以使用前向声明,也就是在文件顶部给出函数声明。对于大型项目,使用前向声明有可能使数小时的编译时间压缩为只需要几分钟。

5.当两个定义互相使用对方时,打破循环

除此之外,实现前向声明可以打破循环。这种情况是,两个函数试图互相调用对方。如果出现这种情况,可以#include一个头文件,但是那个头文件又试图#include你目前正在写的文件,两个文件互相#include, 可以使用前向声明解决这个问题。即一个文件使用前向声明,另一个文件使用 #include。

举例:

文件Car.h:

// File Car.h
#include "Wheel.h"  // Include Wheel's definition so it can be used in Car.
#include <vector>
class Car
{
    std::vector<Wheel> wheels;
};

但是对于头文件 Wheel.h, 必须提供Car 的声明,原因是因为类Wheel含有一个指向Car的指针,但是不能在文件 Wheel.h 中包含Car.h,如果包含,将产生编译错误。如果Wheel.h 包含 Car.h, Car.h 又会包含 Wheel.h, Wheel.h 又会包含Car.h, 如此将陷入不断的循环中,所以编译器没有这样做,而是引发了一个错误。
解决这个问题的方法是声明Car,不能使用包含:

// File Wheel.h
class Car;     // forward declaration
class Wheel
{
    Car* car;
};

如果类 Wheel 含有方法,这些方法需要调用Car的方法,那么Wheel的方法可以定义在文件Wheel.cpp 中,Wheel.cpp 可以包含Car.h, 但不会导致循环。

6 另一个例子

相对简单的例子, 两个文件 main.cpp 和 add.cpp, 使用前向声明,不包含头文件,一样可以编译通过:

// add.cpp:
int add(int x, int y)
{
    return x + y;
}
// main.cpp:
#include <iostream>
int add(int x, int y); // 前向声明
int main()
{
    std::cout << "The sum of 3 and 4 is " << add(3, 4) << std::endl;
    return 0;
}

[1] https://stackoverflow.com/questions/4926105/what-is-forward-declaration-in-c
[2] https://stackoverflow.com/questions/553682/when-can-i-use-a-forward-declaration
[3] https://stackoverflow.com/questions/4757565/what-are-forward-declarations-in-c
————————————————
版权声明:本文为CSDN博主「2222345345」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/ftell/article/details/80481662

 

标签:Wheel,文件,Car,C++,前向,forward,include,声明
来源: https://www.cnblogs.com/sggggr/p/12805641.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有