是否需要包含头文件?

Is including header file necessary?

本文关键字:文件 包含头 是否      更新时间:2023-10-16

add.h:

int add(int x, int y); // function prototype for add.h -- don't forget the semicolon!

为了在main.cpp中使用此头文件,我们必须 #include 它(使用引号,而不是尖括号(。

主.cpp:

#include <iostream>
#include "add.h" // Insert contents of add.h at this point.  Note use of double quotes here.
int main()
{
    std::cout << "The sum of 3 and 4 is " << add(3, 4) << 'n';
    return 0;
}

添加.cpp:

#include "add.h"
int add(int x, int y)
{
    return x + y;
}

嗨,我想知道,为什么我们在文件 add.cpp 中有 #include"add.h"?我认为没有必要。

C++每个文件都以所谓的"翻译单元"单独编译。基本上,在大多数设置中,翻译单元是单个.cpp文件的编译。

当编译器编译一个.cpp文件时,他看不到存储在其他.cpp文件中的信息。它只能看到这个.cpp文件。

#include是一个简单的文本替换指令。 #include "add.h"告诉编译器将文件的内容按原样插入文件add.h(在编译器特定的包含搜索路径中找到(main.cpp

当你写add(3, 4)编译器需要知道add。它返回什么?是unsigned long long论据还是unsigned char论据?为了告诉编译器函数返回类型和参数类型,我们使用函数声明,例如int add(int, int);。或者int add(int something, int anything);.函数声明中的参数名称在这里用作程序员的文档 - 编译器的重要部分是类型。

编译器看不到存储在 add.cpp 中的信息。它(通常(被编译为一个单独的翻译单元。因此,我们需要告诉编译器有关add()函数的类型。该信息通常存储在包含在两个翻译单元中的标头中 - 在使用该函数的"消费者"main.cpp中,以及在实现函数及其作用的"实现"add.cpp中。通常,标头的名称与实现具有不同扩展名的函数的文件相同。

为什么我们在文件中添加.cpp中有 #include"add.h"?

主要是作为程序员对错误和更改的防御。由于两个翻译单元是单独编译的,因此程序员的工作是在它们之间正确同步信息。

如果你#include "add.h"更改函数的返回类型,例如add,但忘记在实现中更改它,编译器会抱怨。当使用 class es 时,标头的使用变得越来越重要,它们在标头中的一个位置定义了所有类成员、继承等。

为了"同步"接口和实现以减少错误,我们在使用者和实现中包含带有声明的标头。这样,如果您碰巧更改了函数的返回类型,但忘记更改add.cpp文件,编译器就会抱怨。

我认为没有必要。

对于这么简单的项目,没有必要,但如果你不这样做,我会认为它是"糟糕的风格"或"意大利面条代码"。add.h文件告诉我add.cpp文件中的内容 - 定义了哪些函数。

为什么我们在文件add.cpp中有#include "add.h"?我认为没有必要。

在这种情况下,不,这不是必需的,但也不是有害的。

像这样的一揽子样式规则有助于避免代码更改时可能出现的问题,尤其是在具有多个作者的大型项目中。

当然,没有必要。但是,在实际项目中,具有更多函数或类声明。它将成为强制性的。

因此,这是一个很好的做法,编译器需要一点时间来解析它。