vc包含路径/附加包含路径/include的机制

来源:互联网 发布:ati hd 5770 mac 编辑:程序博客网 时间:2024/06/06 00:40

以下结论还需要进一步验证,所以会不断修正.


1. #include <> 不找当前目录和附加目录.只找默认属性表里配的路径(标准包含目录)

2. #include "" 都找

3. 查找顺序:当前目录(工程文件的目录),(此CPP文件的目录), 附加包含目录, 标准包含目录, 

4. 特别的, 两种include都支持相对路径. 


举例: 

目录结构

test\        =>项目根目录

test\stdafx.h

test\stdafx.cpp

test\foo\

test\foo\a.cpp      =>包含stdafx.h
stdafx.h

=========================

stdafx.h 文件的包含问题. 此项目不使用预编译头, 所以包含关系是很明确的包含关系
其中  a.cpp  包含stdafx.h, 但在 foo目录下没有stdafx.h文件. 咋办? 编译会失败, 提示找不到stdafx.h

怎么解决呢?

1. 如果不使用预编译,使用相对路径: a.cpp 里使用 #include "..\stdafx.h" 或者绝对路径.

2. 整个项目使用预编译头,stdafx.h 本身 作为预编译头文件或者包含到某个预编译头文件里.

3. 在foo目录放一个stdafx.h

4. 附加目录包含test目录.或者相对的或者绝对目录.

如果a.cpp 是存在于其他项目里的. 你不能改/或者不想改那个项目, 你只是把它包含到你的项目里来. 

那么 只有使用预编译的方法.test\stdafx.cpp

=======================

如果foo目录已经有stdafx.h 但你不想让a.cpp包含它. 而想让a.cpp包含 test目录下的stdafx.h

有两个方法:

1. 如果不使用预编译, 就修改a.cpp里的包含语句, 改成相对或者绝对路径.

2. 整个项目使用预编译头,根目录下的 stdafx.h 本身 作为预编译头文件或者包含到某个预编译头文件里.

注意: 这个时候, 特别有个方法无效:  

如果不使用预编译, 通过在附加包含目录最前面包含test\foo目录.或者foo目录的绝对路径的办法. 都无效. 因为vc会先找cpp所在目录