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

Setting up a project which would compile both with and without precompiled header

本文关键字:项目 编译 可以使 一个 设置      更新时间:2023-10-16

我要做的是建立一个项目,无论是否设置预编译头。stdafx.hpp是我的P.H.

我的主要问题是我的文件在几个目录,而不仅仅是项目根目录。What have I try:

    如果我<<li> p>
    #include "stdafx.hpp"
    

    任何地方都可以正常工作PH设置,但如果我停用它,它会抱怨,因为子目录中的文件找不到它。

    如果我<<li> p>
    #include "../stdafx.hpp"
    

    在subdirs下的文件中,没有PH可以正常工作,但是有了PH,编译器会抱怨stdafx.hpp没有被包括在内。

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

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

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

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

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

使用带有双引号的#include指令的规则概述在#include指令(C/c++):
形式:引用

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

  1. 与包含#include语句的文件在同一目录下。
  2. 在当前打开的目录中包含文件,以打开的相反顺序。从父include文件的目录开始搜索,然后继续向上搜索所有祖父include文件的目录。
  3. 沿着每个/I编译器选项指定的路径。
  4. 沿着INCLUDE环境变量指定的路径。

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

/FIstdafx.hpp

没有设置/项目拓扑的组合,将允许您简单地切换预编译头打开或关闭。/Y、/FI和/I编译器开关必须同时使用,否则将其完全移除。要将一组配置作为一个单元来更改,您可以使用属性页(详细信息请参见使用项目属性)。

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

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