C++ 头文件中 <> 和 “” 的区别

#include <cstdio>
#include "hello.h"

int main(){
	printf("hello world!");
    return 0;
}

<cstdio> 这种形式表示不要在当前目录下进行搜索,只在系统目录里搜索;
"hello.h" 这种形式则优先搜索当前目录下有没有这个文件,找不到再进行搜索系统目录;
所以一般自己写的头就用 "" 来包,系统提供的头就用 <> 来包

需要注意的是,上面的程序中,当然也可以把 #inlucde <cstdio>"" 来包,写成 #include "cstdio",这样先会在当前目录下找一下有没有 cstdio,没有的话再到系统目录里找。但是存在一些风险,比如我就恰好在当前目录下就有一个 脏数据的 cstdio,那么程序编译就会出错了


还有个相对路径的例子

这个工程

记录 | C++头文件中 <> 和 ““ 的区别_当前目录

外面的 CMakeLists.txt 长这样:

记录 | C++头文件中 <> 和 ““ 的区别_当前目录_02

子工程 hellolib 里面的 CMakeList.txt 长这样:

记录 | C++头文件中 <> 和 ““ 的区别_当前目录_03

hello.cpp 的代码长这样:

记录 | C++头文件中 <> 和 ““ 的区别_#include_04

可以看到在 子工程里的 CMakeList.txt 中不用这么写:

add_library(hellolib STATIC hello.cpp hello.h)  // 不用写 hello.h

正是因为 #include "hello.h" 它会自动先在当前目录下找


还有个问题

按着上面的例子,来看

最开始的 main.cpp 长这样,头是这么包的 => #include "hellolib/hello.h"

记录 | C++头文件中 <> 和 ““ 的区别_c++_05

之前的外面的 CMakeList.txt 是长这样的:

记录 | C++头文件中 <> 和 ““ 的区别_头文件_06

接下来魔法来了,我加一句 target_include_directories(a.out PUBLIC hellolib)

记录 | C++头文件中 <> 和 ““ 的区别_当前目录_07

通过 target_include_directories 来指定要包的头文件的目录,这样用 target_include_directories 指定的路径会被视为与系统路径等价,这样就可以这么来包 hello.h

记录 | C++头文件中 <> 和 ““ 的区别_当前目录_08

上面这样包完全没有问题,相当于会去系统路径下找 hello.h

当然也可以这么包,相当于会去 target_include_directories 指定的路径下去找 hello.h

记录 | C++头文件中 <> 和 ““ 的区别_当前目录_09

当然也可以像最开始那样包 hello.h,也能够找到 hello.h

记录 | C++头文件中 <> 和 ““ 的区别_当前目录_10

但是你需要清楚,三种方式的原理是不一样的