C/C++ 头文件引入

C/C++ 中引入头文件有两种方式,#include ""#include <>

双引号形式的 #include "" 会首先在当前文件所在目录下搜索尝试引入的头文件(并不会递归向下级目录搜索)。如果没有搜索到则去系统预先配置的标准头文件目录中寻找。类似的,尖括号形式的 #include <> 会直接在系统预先配置的标准头文件目录中寻找。

那系统预先配置的标准头文件目录是什么呢?对于 C 语言来说,在 Linux 下可以使用 cpp -v /dev/null -o /dev/null 命令来查看:

其中 #include <...> search starts here: 下面就是标准头文件目录,gcc 的预处理器 cpp 就会在这些目录下寻找头文件。我们也可以在其中的 /usr/include 目录下看到我们熟悉的 stdio.h 等文件。

类似的,查看 C++ 的标准头文件目录可以使用 g++ -v -E xxx.cpp > /dev/null ,把其中的 xxx.cpp 换成随便一个存在的 C++ 文件:

命令行选项

使用 gcc 编译的时候,还可以通过命令行选项来增添自定义的头文件搜索目录,其中最常用的是 -Idir 。当在编译时指定了这个选项,则预处理器会首先在当前目录下寻找头文件(假如使用的是 include ""),然后在 -Idir 指定的目录中寻找头文件,最后在系统标准头文件目录中寻找。

-I 选项在编译 C/C++ 文件时都会生效,如果你想区分 C/C++ 文件,则可以使用 -iquote-isystem 选项。-iquote 指定的目录只在编译 C 文件时生效,-isystem 指定的目录只在编译 C++ 文件时生效。

环境变量

同样环境变量也可以用来指定头文件搜索路径。CPATH 环境变量格式类似于 PATH ,即用冒号将多个目录分隔开:dir1:dir2:dir3 。使用 CPATH 指定的目录就相当于用 -I 选项指定了这些目录,只不过在搜索头文件的时候优先级低于所有直接用 -I 选项指定的目录。

类似的,如果你想分开控制 C/C++ 的搜索头文件的路径,则可以使用 C_INCLUDE_PATHCPLUS_INCLUDE_PATH。它们分别只对 C 文件和 C++ 文件生效。

参考材料

https://stackoverflow.com/questions/1217943/where-are-include-files-stored-ubuntu-linux-gcc
https://gcc.gnu.org/onlinedocs/cpp/Search-Path.html
https://gcc.gnu.org/onlinedocs/cpp/Environment-Variables.html#Environment-Variables

Last modification:September 24th, 2020 at 07:12 pm