C++ 头文件中 <> 和 “” 的区别
#include <cstdio>
#include "hello.h"
int main(){
printf("hello world!");
return 0;
}
● <cstdio>
这种形式表示不要在当前目录下进行搜索,只在系统目录里搜索;
● "hello.h"
这种形式则优先搜索当前目录下有没有这个文件,找不到再进行搜索系统目录;
所以一般自己写的头就用 ""
来包,系统提供的头就用 <>
来包
需要注意的是,上面的程序中,当然也可以把
#inlucde <cstdio>
用""
来包,写成#include "cstdio"
,这样先会在当前目录下找一下有没有 cstdio,没有的话再到系统目录里找。但是存在一些风险,比如我就恰好在当前目录下就有一个 脏数据的 cstdio,那么程序编译就会出错了
还有个相对路径的例子
这个工程
外面的 CMakeLists.txt
长这样:
子工程 hellolib
里面的 CMakeList.txt
长这样:
hello.cpp
的代码长这样:
可以看到在 子工程里的 CMakeList.txt 中不用这么写:
add_library(hellolib STATIC hello.cpp hello.h) // 不用写 hello.h
正是因为 #include "hello.h"
它会自动先在当前目录下找
还有个问题
按着上面的例子,来看
最开始的 main.cpp
长这样,头是这么包的 => #include "hellolib/hello.h"
之前的外面的 CMakeList.txt
是长这样的:
接下来魔法来了,我加一句 target_include_directories(a.out PUBLIC hellolib)
通过 target_include_directories
来指定要包的头文件的目录,这样用 target_include_directories
指定的路径会被视为与系统路径等价,这样就可以这么来包 hello.h
了
上面这样包完全没有问题,相当于会去系统路径下找 hello.h
当然也可以这么包,相当于会去 target_include_directories
指定的路径下去找 hello.h
当然也可以像最开始那样包 hello.h
,也能够找到 hello.h
但是你需要清楚,三种方式的原理是不一样的