2023年7月29日,周六晚上
今天下午和晚上花了不少时间去研究这个C/C++的头文件以及#include<xxx.h>和#include"xxx.h"之间的区别,收获到了很多的很有用的知识。非常值得花时间来以博客的形式总结这些学习成果。
说实话,我挺想逃避写这样的博客的,因为内容很多很复杂,想表达清楚非常困难。但是只有克服困难,才能让一篇博客产生良好的社会效益。
如果有写得不对或不够好的地方,还请指出我的错误。
写了几个小时后,终于完成大部分内容了,以后有空可能会更新。
之后,我可能会结合C++11的开源项目ceceal的官方示例程序的头文件来继续拓展这篇文章。
目录
- #include和#include"xxx.h"之间的区别
- 搜索的路径不同
- 引用头文件的四种方式
- 系统头文件目录和系统库文件目录在哪里
- Linux环境
- Windows环境(以gcc为例)
#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"
系统头文件目录和系统库文件目录在哪里
Linux环境
在Linux中,系统头文件目录一般在/usr/include中,系统库文件目录一般在/usr/include
Windows环境(以gcc为例)
可以通过在命令行运行 gcc -v
命令,来查看 gcc 当前使用的系统头文件目录和系统库文件目录。
建议把命令输出的内容复制到记事本来看,这样会清晰很多。
把命令行的内容复制到记事本,这样看得更清楚
接下来,我会拿出上面的有关内容来分析
CFLAGS='-O2 -pipe -fno-ident
-I/c/mingw810/x86_64-810-posix-seh-rt_v6-rev0/mingw64/opt/include
-I/c/mingw810/prerequisites/x86_64-zlib-static/include
-I/c/mingw810/prerequisites/x86_64-w64-mingw32-static/include'
CXXFLAGS='-O2 -pipe -fno-ident
-I/c/mingw810/x86_64-810-posix-seh-rt_v6-rev0/mingw64/opt/include
-I/c/mingw810/prerequisites/x86_64-zlib-static/include
-I/c/mingw810/prerequisites/x86_64-w64-mingw32-static/include'
CPPFLAGS='
-I/c/mingw810/x86_64-810-posix-seh-rt_v6-rev0/mingw64/opt/include
-I/c/mingw810/prerequisites/x86_64-zlib-static/include
-I/c/mingw810/prerequisites/x86_64-w64-mingw32-static/include'
LDFLAGS='-pipe -fno-ident
-L/c/mingw810/x86_64-810-posix-seh-rt_v6-rev0/mingw64/opt/lib
-L/c/mingw810/prerequisites/x86_64-zlib-static/lib
-L/c/mingw810/prerequisites/x86_64-w64-mingw32-static/lib '
-L/c/mingw810/x86_64-810-posix-seh-rt_v6-rev0/mingw64/opt/lib
-L/c/mingw810/prerequisites/x86_64-zlib-static/lib
-L/c/mingw810/prerequisites/x86_64-w64-mingw32-static/lib '
-I表示要搜索的头文件路径,-L表示要搜索的库文件路径。
CFLAGS表示C编译器的编译选项,CXXFLAGS表示C++编译器的编译选项,
CPPFLAGS表示C预处理器的选项,LDFLAGS表示链接器的选项。
这些内容这么多,我怎么看出gcc的系统头文件目录和系统库文件目录在哪里呢????
很简单,你只需要看这5段中的第一个-I或第一个-L后面的内容就可以了,
并且去掉其中的mingw810/x86_64-810-posix-seh-rt_v6-rev0,
因为这部分内容和路径无关,是一些系统信息:
mingw810
:是指MinGW编译器的版本号,810意为gcc8.1.0
。MinGW是一个用于Windows环境的开源软件开发工具集,它提供了一套GNU工具,包括编译器、链接器等。x86_64
:使用的是64位架构(x86-64)。posix-seh
:使用了POSIX风格的异常处理(SEH)。rt_v6-rev0
:使用的运行时(runtime)库的版本号。
通过gcc --version命令,可以验证上面的信息
按照上面所说的去做,这5段内容最后剩下的信息只有下面这些了(为了便于理解,我保留了CFLAGS、CXXFLAGS、CPPFLAGS、LDFLAGS)
//gcc编译C源文件时,在C:/mingw64/opt/include中搜索头文件
CFLAGS='-I/c/mingw64/opt/include '
//gcc编译C++源文件时,在C:/mingw64/opt/include中搜索头文件
CXXFLAGS='-I/c/mingw64/opt/include '
CPPFLAGS='-I/c/mingw64/opt/include '
LDFLAGS='-L/c/mingw64/opt/lib '
//gcc编译源文件时,在C:/mingw64/opt/lib中搜索库文件
-L/c/mingw64/opt/lib'
现在来验证一下这些路径是否存在