2023年7月29日,周六晚上
今天下午和晚上花了不少时间去研究这个C/C++的头文件以及#include<xxx.h>和#include"xxx.h"之间的区别,收获到了很多的很有用的知识。非常值得花时间来以博客的形式总结这些学习成果。
说实话,我挺想逃避写这样的博客的,因为内容很多很复杂,想表达清楚非常困难。但是只有克服困难,才能让一篇博客产生良好的社会效益。
如果有写得不对或不够好的地方,还请指出我的错误。
写了几个小时后,终于完成大部分内容了,以后有空可能会更新。
之后,我可能会结合C++11的开源项目ceceal的官方示例程序的头文件来继续拓展这篇文章。
2023年7月30日,周日早上
今天早上录cereal项目视频的时候,发现按照昨天写的gcc找系统头文件的方法有误,于是找出错误后重新写了一篇。所以现在这篇是我重新写的,标题和文章结构也改了一下。
目录
- #include和#include"xxx.h"之间的区别
- 搜索的路径不同
- 引用头文件的四种方式
- gcc和g++的系统头文件目录在哪里?
- gcc的查找方法
- g++的查找方法
- 拓展内容
- gcc和g++的系统库文件目录在哪里?
- gcc的查找方法
- g++的查找方法
#include<xxx.h>和#include"xxx.h"之间的区别
搜索的路径不同
#include<xxx.h>只会到系统头文件目录中寻找。
#include"xxx.h"没带路径且只有一个头文件的名字时,比如#include"myHeader.h",那么会先在写有这句代码的源文件的当前目录中查找,没找到的话,就去系统头文件目录中查找;如果带有路径的话,比如#include"C:\myFolder\myHeader.h",就会先按照指定的路径去查找,没找到的话,就去系统头文件目录中查找。
总而言之,#include"xxx.h"的搜索范围覆盖#include<xxx.h>的搜索范围,而且#include"xxx.h"的搜索范围比#include<xxx.h>的搜索范围要大。
所以类似#include<stdio.h>的语句都可以写成#include"stdio.h",但是不建议那么做,因为会无意义地多搜索一些地方,从而产生一定的时间浪费。
引用头文件的四种方式
- #include<带路径的头文件>,比如Linux中的#include<sys/time.h>
- #include<头文件>,比如标准C语言的#include<stdio.h>
- #include"带路径的头文件",比如#include"myFolder/myHeader.h"
- #include"头文件",比如#include"myHeader.h"
gcc和g++的系统头文件目录在哪里?
gcc的查找方法
通过如下命令可以查看gcc的系统头文件目录:
gcc -xc -E -v -
这个命令的作用是用gcc编译一个空的源文件(-xc
选项表示使用C语言进行编译,-E
选项表示进行预处理),并且使用-v
选项打印出详细的编译过程信息。通过查看编译过程中的输出信息,可以找到gcc编译器所使用的头文件搜索路径。
在命令输出的内容中,最后那部分的#include<...>search starts here就是gcc的系统头文件目录
g++的查找方法
通过如下命令可以查看g++的系统头文件目录:
g++ -xc++ -E -v -
这个命令的作用是用g++编译一个空的源文件(-xc++
选项表示使用C++进行编译,-E
选项表示进行预处理),并且使用-v
选项打印出详细的编译过程信息。通过查看编译过程中的输出信息,可以找到g++编译器所使用的头文件搜索路径。
在命令输出的内容中,最后那部分的#include<...>search starts here就是g++的系统头文件目录
拓展内容
一点小拓展,通过给gcc或g++添加选项v可以查看一个源文件的编译过程:
g++ xxx.cpp -o xxx -v
输出的编译过程包括头文件的寻找过程
gcc和g++的系统库文件目录在哪里?
gcc的查找方法
通过如下命令可以查看gcc的系统库文件目录
gcc -print-search-dirs
libraries后面的内容就是gcc的系统库文件目录
g++的查找方法
通过如下命令可以查看g++的系统库文件目录
g++ -print-search-dirs
libraries后面的内容就是g++的系统库文件目录