---
slug: include-header
lesson: 3
chapter: 1
chapterTitle: 程序
title: "#include 头文件是什么？为什么程序开头都要写它"
description: "#include 的作用是引入已写好的功能：包含 <iostream> 之后才能使用 cout。本课讲清头文件的作用、尖括号与引号的区别、常见头文件的分工，以及忘记包含时的报错特征。"
code: |
  #include <iostream>
  #include <string>
  using namespace std;

  int main() {
      string name = "CppStudio";
      cout << "你好，" << name << endl;
      return 0;
  }
faq:
  - q: "#include <iostream> 里的 iostream 是什么？"
    a: iostream 是 C++ 标准库的头文件，提供输入输出功能，cout 和 cin 都由它提供。名称是 input-output-stream（输入输出流）的缩写。
  - q: 尖括号 <> 和引号 "" 有什么区别？
    a: 尖括号用于标准库头文件，编译器到标准库目录查找；引号用于你自己编写的头文件，编译器先在项目目录查找。入门阶段几乎都使用尖括号。
  - q: "#include 是不是把文件复制进来？"
    a: 可以这样理解：预处理器在编译前把头文件内容展开到 #include 所在位置。因此 #include 必须出现在使用这些功能的代码之前，惯例是集中在文件开头。
  - q: 忘记 #include 会怎么样？
    a: 编译器报 use of undeclared identifier（未声明的标识符），例如不认识 cout。看到某个名字「未声明」，首先检查对应的头文件是否已包含。
---

<div class="answer">
#include 的作用是引入已写好的功能。cout、cin 并非语言内置，而是标准库头文件提供的：
使用 cout 之前必须 #include &lt;iostream&gt;，使用 string 之前必须 #include &lt;string&gt;。
头文件集中在程序开头，编译器才知道这些名字的来源。
</div>

## 头文件是什么

C++ 语言本身很小，常用能力——输入输出、字符串、数学函数、容器——都由**标准库**提供。标准库按功能划分为若干**头文件**，每个头文件是一类功能的说明书：

| 头文件 | 提供的功能 |
|---|---|
| `<iostream>` | cout 输出、cin 输入 |
| `<string>` | string 字符串 |
| `<cmath>` | sqrt、pow 等数学函数 |
| `<vector>` | vector 动态数组（后续章节学习） |

`#include <iostream>` 的含义：把 iostream 这份说明书交给编译器，此后代码中出现 `cout`，编译器能查到它的定义。

## 为什么集中在文件开头

#include 在**编译之前**处理：预处理器把头文件内容展开到该指令所在位置。顺序因此重要——必须先有说明书，后续代码才能使用说明书中的名字。行业惯例：所有 #include 集中放在文件顶部。

本课示例包含了两个头文件：

```cpp
#include <iostream>
#include <string>
using namespace std;

int main() {
    string name = "CppStudio";
    cout << "你好，" << name << endl;
    return 0;
}
```

`string` 来自 `<string>`，`cout` 来自 `<iostream>`。删除 `#include <string>` 再运行，编译器会报 `use of undeclared identifier 'string'`——这是缺少说明书的直接后果。

## 尖括号与引号

- `#include <iostream>`：尖括号，标准库头文件，编译器到标准库目录查找；
- `#include "myutil.h"`：引号，自己编写的头文件，编译器先在项目目录查找。

入门阶段的程序都是单文件，只涉及尖括号形式；多文件工程出现在后续阶段。

## 常见错误

- **忘记包含**：报 `use of undeclared identifier`。看到「未声明」，先查头文件；
- **头文件名拼错**：如 `<iostram>`，报 `file not found`；
- **末尾加分号**：`#include <iostream>;` 是错的——#include 是预处理指令，不是 C++ 语句，不需要分号。

下一课：using namespace std 这行代码究竟做了什么。
