關于 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" |