c++ - C++ 中包含双 header ?

标签 c++ header

我有一个看似相对简单的问题,但我一直无法理解它。

如果这是一个简单的问题,我深表歉意,但像许多简单的问题一样,我似乎无法在任何地方找到可靠的解释。

使用以下代码:

/*foo.c*/

#include "bar.h"

int main() {
   return(my_function(1,2));
}

/*bar.h*/

int my_function(int,int);

/*bar.c*/

#include "bar.h" /*is this necessary!?*/

int my_function(int x, int y) {
    return(x+y);
}

简单来说,二次包含有必要吗?我不明白为什么我总是看到两个源文件中都包含标题。当然,如果通过包含“bar.h”在“foo.c”中声明该函数,则不需要在另一个链接的源文件(尤其是实际定义它的文件)中再次声明???一位 friend 试图向我解释说,这对函数来说并不重要,但对结构来说却很重要,但我仍然无法理解!帮助!

是否只是为了清楚起见,以便程序员可以看到外部正在使用哪些功能?

我就是不明白!

谢谢!

最佳答案

在这种特殊情况下,由于您描述的原因,这是不必要的。在您拥有一组可能相互依赖的更复杂功能的情况下,它可能很有用。如果您在 .cpp 文件的顶部包含 header ,则您已经有效地转发声明了每个函数,因此您不必担心确保您的函数定义按特定顺序排列.

我还发现它清楚地表明这些 函数定义对应于那些 声明。这使读者更容易发现翻译单元如何相互依赖。当然,文件名可能就足够了,但是一些更复杂的项目在.cpp 文件和.h 文件之间并没有一对一的关系。有时 header 被分成多个部分,或者许多实现文件将在单个 header 中声明其外部函数(对于大型模块很常见)。

真的,所有的内含物都是不必要的。毕竟,您总是可以在所有需要它们的文件中复制声明(或定义,在类的情况下)。我们使用预处理器来简化这个任务并减少冗余代码量。坚持始终包含相应 header 的模式更容易,因为它始终有效,而不是每次编辑文件时都必须检查每个文件并确定是否需要包含。

关于c++ - C++ 中包含双 header ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27128364/

相关文章:

c++ - 如何将 error_code 设置为 asio::yield_context

c++ - 使用 OpenSSL boost ASIO 无法读取 HTTP header

c++ - 以下场景如何使用前向声明

c++ - 使用 std::function 的优点

javascript - 单击链接后如何显示水平列表?

c++ - 缺少显式类型(假定为 int)

c++ - 从 Visual Studio 运行 Simulink 模型时出现编译器错误

c++ - 来自文本文件的grep字符串并将其复制到CMake中的目录

html - css 更有效率?更改箭头和标题的颜色

c++ - 使用头文件中定义的 vector 时出现 Unresolved external symbol 错误