设置一个可以使用和不使用预编译头

时间:2016-08-26 11:51:14

标签: c++ visual-studio visual-studio-2015 precompiled-headers

我要做的是设置一个项目,如果设置了预编译头,则无关紧要。 stdafx.hpp是我的P.H。

我的主要问题是我有多个目录上的文件,而不仅仅是项目根目录。我尝试了什么:

  1. 如果我

    #include "stdafx.hpp"
    

    在PH设置的情况下无处不在,但如果我将其停用,它会抱怨,因为子目录中的文件无法找到它。

  2. 如果我

    #include "../stdafx.hpp"
    

    在子目录中的文件中,没有PH就可以正常工作,但是对于PH,编译器会抱怨stdafx.hpp没有被包含在内。

  3. 如果我将强制包含文件设置为stdafx.hpp,无论是相对路径还是绝对路径,编译器都会给我错误(现在不能记住,如果有必要我会重现它)。

  4. 那么,可能是什么解决方案?

2 个答案:

答案 0 :(得分:6)

规范解决方案很简单:不要包含预编译的头文件(默认情况下为 stdafx.h )。如果您的代码需要使用预编译头进行编译,请使用/FI (Name Forced Include File)编译器开关:

  

此选项与在命令行,CL环境变量或命令文件中指定的每个源文件的第一行上的#include指令中使用双引号指定文件具有相同的效果。

这允许您使用预编译的头文件,而无需修改源代码。

#include Directive (C/C++)下概述了使用带有双引号的#include指令的规则:

  

引用表格:

     

预处理器按此顺序搜索包含文件:

     
      
  1. 与包含#include语句的文件位于同一目录中。
  2.   
  3. 在当前打开的包含文件的目录中,按照打开它们的相反顺序。搜索从父包含文件的目录开始,并继续向上遍历任何祖父包含文件的目录。
  4.   
  5. 沿着每个/ I编译器选项指定的路径。
  6.   
  7. 沿着INCLUDE环境变量指定的路径。
  8.   

使用/I (Additional Include Directories)编译器开关来包含用于生成预编译头的头文件的目录,然后只允许你编写

/FIstdafx.hpp

没有设置/项目拓扑的组合可以让您简单地打开或关闭预编译的标头。 /Y,/ FI和/ I编译器开关必须一起使用,或者完全删除。要将一组配置更改为一个单元,您可以使用属性页(有关详细信息,请参阅Working with Project Properties)。

答案 1 :(得分:1)

一个简单的解决方案是设置项目的包含路径,以便普通#include "stdafx.hpp"始终找到标题,而不管包含文件的目录。

如果您担心无意中使其他目录中的头文件可见,您甚至可以将可能预编译的头文件放在其自己的特殊目录中。