在 C 语言中,头文件的包含有两种方式,使用 尖括号 <> 或 双引号 "":
- 尖括号 <>
#include <stdio.h>
#include <stdlib.h>
· 查找路径:编译器在系统标准头文件目录中搜索头文件。
· 如:/usr/include(Linux)、C:\MinGW\include(Windows)、编译器安装目录等。
· 用途:用于包含系统标准库头文件或编译器提供的头文件。
· 示例:<stdio.h>、<stdlib.h>、<string.h> 等。
- 双引号 ""
#include "myheader.h"
#include "../utils/helper.h"
· 查找路径:
- 先在当前源文件所在目录搜索头文件。
- 如果没找到,再按尖括号的方式到系统目录中搜索。
· 用途:用于包含程序员自己编写的头文件或项目内部的头文件。
· 示例:"config.h"、"myheader.h"、"../include/utils.h" 等。
- 主要区别
特性 #include <file.h> #include "file.h"
搜索路径 系统标准目录 先当前目录,后系统目录
用途 标准库头文件 自定义头文件
示例 <stdio.h> "myfunc.h"
相对路径 通常不支持 支持(如 "../inc/head.h")
- 使用示例
项目结构:
project/
├── src/
│ ├── main.c
│ └── utils.c
├── include/
│ └── utils.h
└── lib/
└── thirdparty.h
代码示例:
// main.c
#include <stdio.h> // 标准库 - 尖括号
#include <stdlib.h> // 标准库 - 尖括号
#include "utils.h" // 自定义头文件 - 双引号
#include "../lib/thirdparty.h" // 相对路径 - 双引号
int main() {
printf("Hello\n");
return 0;
}
- 编译器搜索路径
查看系统包含路径(GCC):
gcc -E -v - # 查看系统包含目录
添加自定义包含路径:
# 编译时添加搜索路径
gcc -I./include -I../lib main.c
· -I 选项可以添加额外的头文件搜索目录,编译器会在这些目录中搜索用 <> 或 "" 包含的头文件。
-
最佳实践建议
-
区分使用:
· 系统库 → 使用 <>
· 自定义头文件 → 使用 "" -
避免混用:
// ❌ 不推荐 #include "stdio.h" // 虽然是标准库,但用了双引号 // ✅ 推荐 #include <stdio.h> // 标准库用尖括号 #include "mylib.h" // 自定义头文件用双引号 -
使用相对路径时:
// 相对当前文件的路径 #include "../inc/config.h" #include "subdir/helper.h" -
大型项目建议:
// 在编译时统一指定包含目录
// gcc -I./include -I./thirdparty src/main.c
// 代码中直接使用
#include <utils.h> // 在 -I 指定的目录中
#include <lib/math.h> // 在 -I 指定的目录的子目录中
- 特殊情况
双引号查找系统头文件:
#include "stdio.h" // 也能工作,但先搜索当前目录,效率稍低
这通常能编译通过,但不推荐,因为:
- 如果当前目录有同名文件,会包含错误的文件
- 降低代码可读性(无法一眼看出是系统库还是自定义文件)
- 总结
场景 推荐方式
C 标准库 #include <xxx.h>
系统库(如 Windows API) #include <windows.h>
第三方库(已安装到系统) #include <curl/curl.h>
自定义头文件(同一目录) #include "myheader.h"
自定义头文件(子目录) #include "inc/myheader.h"
自定义头文件(上级目录) #include "../common.h"
记住这个简单规则:
· 系统/标准库 → <>
· 自己写的头文件 → ""
这样可以提高代码的可读性和可维护性。