#include

Source

关于 C++ 中的 `include <> include “”` 这两种形式,区别其实是关于“搜索路径”和“优先级”的。让我详细为你讲解。


1. 简单区别总结

  • #include <header>:告诉编译器去“系统标准目录”或“预定义的标准路径”中查找头文件(比如系统库、编译器自带的头文件)。
  • #include "header":先在当前源文件所在目录查找,如果找不到,再到系统路径中搜索。

2. 详细机制(搜索顺序)

#include <>

  • 搜索顺序:
    1. 首先在项目或编译器预设的“系统头文件目录”中查找。
    2. 如果找不到,再到其他“标准系统路径”中查找(如 /usr/include/、VS的系统目录等)。
  • 用途:正常用于引用系统库、自带库或第三方库,比如:

    复制代码

    #include <iostream>
    #include <vector>
    

#include ""

  • 搜索顺序:
    1. 首先在当前源文件所在的目录查找。
    2. 如果找不到,再按照<>的路径在系统目录中查找(或者其他配置的路径)。
  • 用途:主要用在自己写的本地头文件,比如:

    复制代码

    #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"