C++ . 具体来说,它不使用普通路径查找方法查找预编译头,而只是尝试通过简单的字符串比较将include指令与项目配置中定义的指令相匹配

C++ . 具体来说,它不使用普通路径查找方法查找预编译头,而只是尝试通过简单的字符串比较将include指令与项目配置中定义的指令相匹配,c++,visual-c++,C++,Visual C++,预编译器头配置是全局设置的,但可以覆盖每个文件。正常的全局配置(通过项目属性->配置属性->C/C++->预编译头访问)是: 默认情况下,此配置应用于项目中的所有文件。但是,stdafx.cpp的配置是在文件级别设置的,并将预编译头值覆盖为: Precompiled Header: Create (/Yuc) 这样做的效果是,对于任何配置为使用预编译头文件的源文件(默认情况下,除了stdafx.cpp之外,它们都是预编译头文件),VS将查找与配置的预编译头文件值匹配的include指令。e、

预编译器头配置是全局设置的,但可以覆盖每个文件。正常的全局配置(通过项目属性->配置属性->C/C++->预编译头访问)是:

默认情况下,此配置应用于项目中的所有文件。但是,stdafx.cpp的配置是在文件级别设置的,并将预编译头值覆盖为:

Precompiled Header: Create (/Yuc)

这样做的效果是,对于任何配置为使用预编译头文件的源文件(默认情况下,除了stdafx.cpp之外,它们都是预编译头文件),VS将查找与配置的预编译头文件值匹配的include指令。e、 g

#包括“stdafx.h”
因为检查使用简单的字符串比较而不是任何类型的目录搜索,所以(不管源文件相对于项目根目录的位置或stdafx.h文件的位置)include指令中使用的路径和文件名必须与项目的预编译头文件配置设置使用的路径和文件名完全匹配。这样做的意外副作用是,如果您有一个包含各种源文件的项目子目录,那么在这些文件中,您不需要使用相对路径引用stdafx.h文件,如..\stdafx.h(如果您这样做,则VS将引发一个错误,说明在查找预编译头时遇到了文件结尾)


只需使用未经修饰的#include“stdafx.h”就可以了,因为VS随后会将其识别为使用预编译头的指令,并且由于stdafx.cpp预编译头配置设置为“Create(/Yc)”,它已经知道正确的预编译头在哪里.

我通常也喜欢在我的项目中有一个层次结构顺序,我发现有两种简单的方法可以包含预编译头:

或者

  • stdafx.h
    所在的目录放入编译器的include目录

    (属性-VC++目录-包括目录:添加
    $(ProjectDir)

  • 如果没有太多的子目录,则绕过错误消息的简单方法如下:

    • 将一个
      stdafx.h
      文件放入每个仅包含顶级
      stdafx.h
      的子目录中:
      #包括“.\stdafx.h”
    • 编写
      #将“stdafx.h”
      作为子目录中所有源文件的第一行,而不是在其中包含顶级文件

  • 这样,您的所有代码文件都使用相同的预编译头文件,并且没有其他复杂的设置要做。

    有趣的是,我使用的技巧不在答案中:

  • 在项目的根文件夹中创建stdafx.h和stdafx.cpp
  • 转到项目属性->预编译标题。改为“使用”
  • 转到stdafx.cpp,右键单击属性->预编译标题。更改为“创建”
  • 进入项目属性->高级;将“强制包含文件”更改为stdafx.h;%(强制包括污染)
  • 不要更改任何CPP文件;保持头文件的原样。按原样构建。


    没有打字,没有RSI,没有包含路径的麻烦,没有其他痛苦和痛苦。美妙之处在于,当您将解决方案移动到另一个平台时,它仍然可以工作。棒极了。

    我建议使用:

    $(ProjectDir)/pch/my_pch.h
    
    作为“预编译头文件”
    和“高级>强制包含文件”

    这将在开始时自动为
    .cpp
    文件包含
    pch
    ,因此不需要在
    .cpp
    文件中更改任何内容


    这比更改include目录要好,因为有时在include目录中可能有多个
    pch
    文件,而您无法判断使用了哪一个。

    -1:
    stdafx.h
    不是系统文件。它是一个预编译的头文件。不是windows的家伙,为什么它有一个.h扩展名?因为它是一个头文件。它可能是预编译的,但它仍然是一个头文件。头文件是一个头文件-预编译-意味着它以某种方式被更改。一个.o文件只是一个预编译的.c文件:-)为什么扩展名没有更改?并不是说扩展名是文件格式的全部和全部。实际的预编译文件不是.h文件。就像在,那不是它的名字。当编译器被告知存在PCH时,当它看到
    #include“PCH_NAME_HERE.h”
    时,将用预编译符号将
    PCH_NAME_HERE.h
    转换为文件的实际名称,从而替换预编译符号<这里的code>PCH\u NAME\u.h在技术上仍然是一个常规头文件;这背后的想法是,你可以编译同一个文件,就像它没有使用PCH一样。嘿,谢谢你的回答,但我想我可能误解了你。配置属性中没有可用的“使用预编译头”设置。此外,我还将“.”添加到配置属性->C\C++->常规->附加包含目录和配置属性->VC++目录->包含目录。它们都不起作用。我更新了以反映VS2010配置路径设置。如果将“.”添加到include路径,还必须将其从c/cpp文件中“stdafx.h”的#include decls中删除。我从cpp文件中删除了stdafx.h include的“.\”部分,该部分位于单独的文件夹中。其他每个文件都可以正常编译,但单独文件夹中的文件现在会生成错误“error C1083:无法打开include file:'stdafx.h':没有这样的文件或目录”。如果默认情况下保留所有预编译头配置,则任何项目子目录中的任何源文件中的简单“include”stdafx.h都可以正常编译。刚刚在VS2012上测试过。使用根包含路径是非常糟糕的
    Precompiled Header: Create (/Yuc)
    
    $(ProjectDir)/pch/my_pch.h