最近遇到一些包含头文件的问题。如下:
同一段C++代码,在win下用vs可以编译通过,但是在linux下就会产生头文件包含错误。之前一直没有对include进行深入研究,下面我们由这个问题出发来深入了解一下include以及解决办法。
首先明确两种include方法:
#include< file >编译程序会到系统目录中找文件~
#include”file” 编译程序会先从当前目录中找文件~
在vc下,系统目录的设置如下:
也就是说如果使用尖括号include,我们会优先从这些目录中去找头文件~
相对来说在linux下设置就比较简单了,那就是通过-I参数。有兴趣的可以看一下我们工程中的makefile文件是怎么使用的。
而通常我们会触发编译问题的用法就是双引号的include了,请注意,双引号的include会先从当前目录中查询,如果查询不到,还是会从系统目录中去查找文件。
这里有个问题:
当前目录下还有一个子目录sub, sub里面有两个文件hdr.h和1.c,1.c中#include "hdr.h",那么在当前目录编译sub/1.c, 它应该包含哪一个hdr.h?
答案是sub/hdr.h,因为1.c是在sub目录中~~~~
所以说到这里,我们再回头看一下最开始的问题,如何才能确保在win下和linux能同时编译过,保证include没有问题。
1.最好确保win下和linux下的目录结构统一,如果目录不统一的话,我们用#include""就会产生在某个平台下头文件找不到的情况
2.如果目录确实不统一,我们需要保证win下附加包含目录和linux下-I指定的参数要相同。为什么?因为当#include""查找不到当前头文件位置时会到系统目录中去寻找,如果win下指定了一个系统目录但是linux下没有指定,那么linux就会在编译时产生问题
3.由问题2我引申出一个想法就是,我们尽量用相对路径去代替绝对路径,这样就能减少问题的产生。