Visual Studio包含路径优先级

时间:2015-02-25 09:39:14

标签: c++ visual-studio

在花了几个小时试图理解为什么我在afxtempl.h中调用new时遇到编译错误,已经用尽了谷歌发现的其他解决方案我意识到有一个本地new.h导致问题(当我说当地人,我的意思是它是构成解决方案的几十个项目之一。)

这需要一段时间才能找到,因为我只是模糊地熟悉代码库并且不期望找到new.h,但也因为我不会想到这会干扰括号中的角度

#include <new.h> 

在afxtempl.h中。我一直都认为

#include <file.h> 

意味着先在系统中查看。

查看来自违规项目的包含路径(除了我的机器上实际不存在的几条本地路径之外):

$(VC_IncludePath)
$(WindowsSDK_IncludePath)

因此,给定new.h是一个不同的项目,它是如何获得的?

此时我应该补充一点,解决方案刚刚从VC ++ 6迁移到VS 2013.

本地new.h不会#define _INC_NEW,或者定义/声明new。这个名字只是巧合,它与内存分配无关。

我只是好奇是否有一些我不知道的包含设置,并且希望将来不会有类似令人沮丧的几个小时。

感谢。

1 个答案:

答案 0 :(得分:0)

首先在每个项目的其他包含目录(C/C++ - General - Additional Include Directories)中搜索尖括号包含。这是documented行为:

  

角括号形式

     

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

     
      
  • 沿着每个/ I编译器选项指定的路径。

  •   
  • 在命令行上进行编译时,沿着INCLUDE环境变量指定的路径进行编译。

  •   
     

...

     

例如,命令

CL /ID:\MSVC\INCLUDE MYPROG.C
     

使预处理器在目录D:\ MSVC \ INCLUDE \中搜索包含文件,例如STDIO.H。

您的项目目录似乎已添加到其他包含目录列表中。您可以在项目设置的C/C++ - CommandLine选项卡中看到传递给编译器的所有命令行选项。

这是C / C ++编译器常用的工作方式,例如参见g++文档:

#include <file>
     

此变体用于系统头文件。它在标准的系统目录列表中搜索名为file的文件。您可以使用-I选项目录添加到此列表中(请参阅调用)。

所以,如果你想保留addtional include目录列表,恐怕没有办法改变这种行为。作为解决方法,您可以将包含文件放在项目根目录的子目录中,并将项目根目录添加到其他目录列表中,因此您的包含文件看起来像#include "project/new.h",但这需要进行代码重组。