是否需要包含头文件?

kkx*_*kxx 2 c++

添加.h:

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

为了在 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;
}
Run Code Online (Sandbox Code Playgroud)

添加.cpp:

#include "add.h"

int add(int x, int y)
{
    return x + y;
}
Run Code Online (Sandbox Code Playgroud)

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

Kam*_*Cuk 5

在 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实现该功能及其功能的“实现”中。通常,标头的名称与实现具有不同扩展名的函数的文件相同。

为什么我们在文件add.cpp中有#include“add.h”?

主要是为了保护程序员免受错误和更改的影响。由于两个翻译单元是单独编译的,因此程序员的工作就是在它们之间正确同步信息。

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

为了“同步”接口和实现以减少错误,我们在消费者和实现中都包含带有声明的标头。这样的话,如果你碰巧换了前任。函数的返回类型,但忘记更改文件add.cpp,编译器会抱怨。

我认为没有必要。

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