开发人员在首次学习并接触C/C++开发语言的时候,就涉及对头文件的#include操作。可以说,这个就是C/C++学习的第一堂课。
一、背景
我们都知道,C/C++头文件的包含有两种,一种是#include <XXX>,另外一种是#include “XXX”,两种的差别就在于包含头文件的标点符合,前者是英文尖括号,后者是英文双引号。两者包含的含义也是存在区别,#include <XXX>表明编译器在编译代码时,默认到系统的头文件目录搜索所包含的头文件XXX,而#include “XXX”则默认先在当前目录搜索所包含的头文件XXX,如果找不到,再到系统的头文件目录进行搜索。
默认的系统头文件目录和当前头文件目录是如何定义的?具体是在什么地方?在这里,基于常用的Windows和Linux系统进行说明,便于对这些细节有个基本了解。
二、Windows环境头文件
(1)系统头文件目录
Windows系统中,就拿常用的MSVC(Visual Studio C++)来说,其C/C++的系统头文件目录主要指以下几个目录:
VC目录下的include子目录(列如C:Program FilesMicrosoft Visual Studio<版本>VCToolsMSVC<版本>include)
Windows Kitsinclude(列如C:Program Files (x86)Windows Kits10Include<版本>)
具体的系统头文件目录列表,可以通过Visual Studio的“Configuration Properties → C/C++ → General → Additional Include Directories”位置进行默认路径的查看。如果要调整,也超级简单,还是通过该位置,通过下拉框的编辑功能进行系统头文件目录的增删改即可。
也可以通过设置系统环境变量INCLUDE来指明C/C++头文件的默认系统目录,支持临时生效和永久生效两种。临时生效通过下列命令行命令进行设置:
set INCLUDE=D:custominclude;%INCLUDE%
临时生效的有效期在命令窗口活动期间,如果关闭则失效。而通过“控制面板 → 系统 → 高级系统设置 → 环境变量”添加的INCLUDE环境变量则可以永久生效。
(2)当前目录
Windows系统的MSVC中,默认当前目录是程序启动时的终端路径(命令提示符或 PowerShell 所在目录),或双击.exe文件时.exe文件所在的目录,也可以是Visual Studio的“Configuration Properties → Debugging → Working Directory”中设置的自定义目录。
可通过系统库函数_getcwd来动态获取当前目录位置,同样也可以通过系统库函数_chdir来调整当前目录位置。
三、Linux环境头文件
(1)系统头文件目录
以GCC编译器为例,系统头文件目录主要包含:
标准 C 库:/usr/include/(如 stdio.h、stdlib.h)
标准 C++ 库:/usr/include/c++/<版本号>/(如 iostream、vector)
编译器特定头文件:/usr/lib/gcc/<架构>/<版本号>/include/
系统特定头文件:/usr/include/linux/ 或 /usr/include/<架构>-linux-gnu/
可以通过下列系统shell命令来查看C/C++头文件的完整搜索路径:
# 查看 C 语言头文件路径
gcc -xc -E -v – < /dev/null
# 查看 C++ 头文件路径
g++ -xc++ -E -v – < /dev/null
也可以在编译代码时通过 -I 选项添加临时的自定义目录(优先级高于默认目录):
gcc main.c -I/path/to/custom/include -o main
还可以通过设置环境变量 C_INCLUDE_PATH(C语言)或 CPLUS_INCLUDE_PATH(C++)来实现系统头文件目录的动态调整。
# 临时生效(在终端或者会话关闭后失效)
export C_INCLUDE_PATH=/path/to/custom/include:$C_INCLUDE_PATH
# 永久生效(写入 ~/.bashrc 或 ~/.zshrc)
echo 'export C_INCLUDE_PATH=/path/to/custom/include:$C_INCLUDE_PATH' >> ~/.bashrc
如果使用cmake工具,那自然通过INCLUDE_DIRECTORIES关键字进行管理系统包含头文件列表。
(2)当前目录
程序启动时的默认当前目录是执行程序的终端所在目录(即执行 ./program 时的终端路径),可通过系统库函数getcwd来动态获取当前目录位置,同样也可以通过系统库函数chdir来调整当前目录位置。
需要注意的是,windows系统与linux系统获取和调整当前目录位置的系统库函数相差一个”_”字符,前者有这个字符,后者没有,大家使用时需要注意。
四、结语
一个简单的C/C++头文件#include指令,所包含的信息量也是不少。知其然,也要知其所以然,这样的记忆才会更加深刻。
五、联系
如果有任何疑问欢迎随时交流。学无止境,实事求是,每天进步一点点!





