头文件与前向声明

时间:2011-01-21 10:19:38

标签: c++ header-files forward-declaration

http://www.learncpp.com/cpp-tutorial/19-header-files/

它提到以下作为“前向声明”的另一种解决方案:

头文件只需写入一次,并且可以根据需要包含在任意数量的文件中。如果函数原型发生变化(例如通过添加新参数),最小化需要进行的更改次数,这也有助于维护。

但是,这也不能用“前瞻性宣言”制作吗?因为我们在“add.cpp”中定义函数int add(int x, int y),并通过输入以下内容在“main.cpp”中使用此函数:

  

int add(int x,int y);

? 感谢。

5 个答案:

答案 0 :(得分:4)

这当然是可能的。但对于一个实际大小的程序,将会有大量的函数需要声明大量其他文件。如果在每个需要访问另一个函数的文件中放置一个前向声明,那么就会遇到很多问题:

  1. 您只是将相同的声明复制粘贴到许多不同的文件中。如果您更改了功能签名,则必须更改您粘贴其前向声明的每个位置。
  2. 前向声明本身并不会自然地告诉您实际函数的定义文件。如果您使用一种理智的方法来组织头文件和源文件(例如,声明.cpp文件中定义的每个函数)在具有相同名称的.h文件中),然后定义函数的位置由声明它的位置隐含。
  3. 对于其他程序员来说,你的代码将不太可读,他们非常习惯使用头文件来处理所有事情(有充分的理由),即使你需要从头文件中获得的只是一个特定的函数,你可以轻松地自己前向声明它

答案 1 :(得分:2)

头文件包含前向声明 - 这就是他们所做的。他们解决的问题是当你有一个包含多个源代码文件的更复杂的项目时。

你可以拥有一个功能库,例如matrix.c用于矩阵运算。如果没有头文件,则必须将所有matrix.c函数的前向声明复制到所有其他源文件中。如果对matrix.c进行任何更改,您还必须保持所有这些副本的最新状态。

如果您更改了matrix.c中的功能,但忘记在其他文件中更改其声明,则会出现编译错误。您可能也不会收到链接器错误。一旦运行程序,您将获得的只是崩溃或其他随机行为。

将声明放在一个文件中,通常是matrix.h,将在其他地方使用,这将消除所有这些问题。

答案 2 :(得分:2)

你可以使用前向声明,但它不能很好地扩展,如果你正在使用其他人的代码或库,那就太笨了。

通常,头文件定义代码的接口。

另外,如果函数需要某些用户定义的类型,请考虑会发生什么。你还要向前宣布吗?该类型可能会定期更改其实现(保持其公共接口相同),这将导致必须定期更改所有前向声明。

头文件解决方案更易于维护(更不容易出错),并且更容易确定正在使用的代码。

答案 3 :(得分:1)

I C和C ++基本上将所有前向和/或外部声明放入标头中。这样就可以方便地将它们包含在各种源文件中,而无需手动包含它们。

在你的情况下,如果你在add.cpp中定义了add,你可以在main.cpp中提供外部声明,一切都很酷。当你有大量需要添加声明的文件并且不想为每个文件添加时,头文件可以帮助你。

答案 4 :(得分:0)

int add(int x, int y); // forward declaration using function prototype
  

你能解释一下“前言宣言”吗?   更进一步?如果有什么问题   我们在main()函数中使用它吗?

#include"add.h"相同。如果您知道,预处理器会在您编写#include指令的.cpp文件中展开您在#include中提及的文件。这意味着,如果你写#include"add.h",你会得到同样的东西,就像你在做“前向宣言”一样。

我假设add.h有这一行:

int add(int x, int y); 

What are forward declarations in C++?