关于 C++ 中的 `include <>和
include “”` 这两种形式,区别其实是关于“搜索路径”和“优先级”的。让我详细为你讲解。
1. 简单区别总结
#include <header>
:告诉编译器去“系统标准目录”或“预定义的标准路径”中查找头文件(比如系统库、编译器自带的头文件)。#include "header"
:先在当前源文件所在目录查找,如果找不到,再到系统路径中搜索。
2. 详细机制(搜索顺序)
#include <>
:
- 搜索顺序:
- 首先在项目或编译器预设的“系统头文件目录”中查找。
- 如果找不到,再到其他“标准系统路径”中查找(如
/usr/include/
、VS的系统目录等)。
- 用途:正常用于引用系统库、自带库或第三方库,比如:
复制代码
#include <iostream> #include <vector>
#include ""
:
- 搜索顺序:
- 首先在当前源文件所在的目录查找。
- 如果找不到,再按照
<>
的路径在系统目录中查找(或者其他配置的路径)。
- 用途:主要用在自己写的本地头文件,比如:
复制代码
这里希望优先用工程中的文件。#include "MyHeader.h"
3. 图示示意
复制代码
源文件
│
├── #include "MyHeader.h" ---> 先在当前目录找
├── #include <iostream> ---> 直接到系统路径找
4. 背后原理(编译器配置)
- 许多编译器(如 gcc/g++、cl 等)允许通过命令行参数或配置参数,定义或修改搜索路径。
- 比如:
复制代码
让编译器在除了默认路径外,也搜索g++ -I/path/to/headers myfile.cpp
/path/to/headers
。
5. 实际工程中的建议:
- 引用自己定义的头文件,用双引号
复制代码
#include "MyComponent.h"
- 引用系统或第三方库,用尖括号
复制代码
#include <vector> #include <pthread.h>
6. 补充:为什么要区分?
- 避免冲突使用双引号优先找本地文件,减少误引用系统头文件。
- 清晰语义明示自己的代码依赖哪个文件,是工程内部的还是系统的。
7. 总结
形式 | 搜索路径 | 主要用途 | 举例 |
---|---|---|---|
#include <> | 系统路径(标准库或其他已配置路径) | 引用系统或第三方库 | <iostream> , <vector> |
#include "" | 当前文件所在目录优先,失败再到系统路径 | 引用本地项目文件 | "MyHeader.h" |