我要做的是设置一个项目,如果设置了预编译头,则无关紧要。 stdafx.hpp
是我的P.H。
我的主要问题是我有多个目录上的文件,而不仅仅是项目根目录。我尝试了什么:
如果我
#include "stdafx.hpp"
在PH设置的情况下无处不在,但如果我将其停用,它会抱怨,因为子目录中的文件无法找到它。
如果我
#include "../stdafx.hpp"
在子目录中的文件中,没有PH就可以正常工作,但是对于PH,编译器会抱怨stdafx.hpp
没有被包含在内。
如果我将强制包含文件设置为stdafx.hpp
,无论是相对路径还是绝对路径,编译器都会给我错误(现在不能记住,如果有必要我会重现它)。
那么,可能是什么解决方案?
答案 0 :(得分:6)
规范解决方案很简单:不要包含预编译的头文件(默认情况下为 stdafx.h )。如果您的代码需要使用预编译头进行编译,请使用/FI (Name Forced Include File)编译器开关:
此选项与在命令行,CL环境变量或命令文件中指定的每个源文件的第一行上的#include指令中使用双引号指定文件具有相同的效果。
这允许您使用预编译的头文件,而无需修改源代码。
在#include Directive (C/C++)下概述了使用带有双引号的#include指令的规则:
引用表格:
预处理器按此顺序搜索包含文件:
- 与包含#include语句的文件位于同一目录中。
- 在当前打开的包含文件的目录中,按照打开它们的相反顺序。搜索从父包含文件的目录开始,并继续向上遍历任何祖父包含文件的目录。
- 沿着每个/ I编译器选项指定的路径。
- 沿着INCLUDE环境变量指定的路径。
醇>
使用/I (Additional Include Directories)编译器开关来包含用于生成预编译头的头文件的目录,然后只允许你编写
/FIstdafx.hpp
没有设置/项目拓扑的组合可以让您简单地打开或关闭预编译的标头。 /Y,/ FI和/ I编译器开关必须一起使用,或者完全删除。要将一组配置更改为一个单元,您可以使用属性页(有关详细信息,请参阅Working with Project Properties)。
答案 1 :(得分:1)
一个简单的解决方案是设置项目的包含路径,以便普通#include "stdafx.hpp"
始终找到标题,而不管包含文件的目录。
如果您担心无意中使其他目录中的头文件可见,您甚至可以将可能预编译的头文件放在其自己的特殊目录中。