设置一个可以使用和不使用预编译头进行编译的项目

And*_*ian 5 c++ precompiled-headers visual-studio visual-studio-2015

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

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

  1. 如果我

    #include "stdafx.hpp"
    
    Run Code Online (Sandbox Code Playgroud)

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

  2. 如果我

    #include "../stdafx.hpp"
    
    Run Code Online (Sandbox Code Playgroud)

    在子目录中的文件中,它在没有PH的情况下工作正常,但是对于PH,编译器抱怨stdafx.hpp没有包含它.

  3. 如果我stdafx.hpp使用相对或绝对路径设置强制包含文件,编译器给了我错误(现在不能记住,如果有必要我将重现它).

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

IIn*_*ble 7

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

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

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

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

引用形式:

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

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

使用/ I(附加包含目录)编译器开关包含用于生成预编译头的头文件的目录,然后只允许您编写

/FIstdafx.hpp
Run Code Online (Sandbox Code Playgroud)

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