C++ Visual Studio生成中未解析间接包含依赖项

C++ Visual Studio生成中未解析间接包含依赖项,c++,visual-studio,visual-studio-2012,msbuild,C++,Visual Studio,Visual Studio 2012,Msbuild,Visual Studio有时会忽略间接生成依赖项,其中类定义中的更改应触发.cpp文件中的重建,该文件通过两个间接包含依赖于它 现在的问题是:这是一个bug还是可以预期的?Visual Studio如何准确地确定对象文件是否是最新的 为了说明这个问题,下面是对设置的分解 在项目中的文件A.h中ProjectA: class A { virtual void x() = 0; }; 在ProjectB中的文件B.h中: #include "A.h" class B : public

Visual Studio有时会忽略间接生成依赖项,其中类定义中的更改应触发
.cpp
文件中的重建,该文件通过两个间接包含依赖于它

现在的问题是:这是一个bug还是可以预期的?Visual Studio如何准确地确定对象文件是否是最新的


为了说明这个问题,下面是对设置的分解

在项目中的文件
A.h
ProjectA

class A
{
    virtual void x() = 0;
};
ProjectB
中的文件
B.h
中:

#include "A.h"
class B : public A
{
    virtual void y() = 0;
};
ProjectC
中的文件
C.h
中:

#include "B.h"
class C : public B
{
    void x() override;
    void y() override;
};
在文件
C.cpp
中:

#include "C.h"
void C::x() {}
void C::y() {}
#include "C.h"
void somefunction()
{
    auto p = make_shared<C>();
}
最后,C在
D.cpp
中实例化:

#include "C.h"
void C::x() {}
void C::y() {}
#include "C.h"
void somefunction()
{
    auto p = make_shared<C>();
}
#包括“C.h”
void函数()
{
自动p=使_共享();
}
现在我添加了方法
virtualvoidz()=0
到类
A
,我确实认为这会导致
C.cpp
的重新编译和
D.cpp
中的失败,因为缺少
z()
的实现。但VisualStudio偶尔会告诉我一切都是最新的,
A.h
中的任何更改都不会触发对
D.cpp
的重新编译,这会导致对程序失败的长时间搜索,最终以重建结束,之后所有程序都会按预期工作


需要说明的是,在添加
z()
之前进行重建时,更改
a.h
的时间戳会触发预期的正确行为。我不愿意复制。

您启用了最小重建(/Gm)吗?projectB依赖projectA,projectC依赖projectB吗?(右键单击解决方案资源管理器中的项目,选择“项目依赖项”)侧注:显示的代码不足以重现问题,它不会链接。否,所有项目的一致设置都是
/Gm-
@stijn否,因为
A
B
是纯虚拟的。如果它总是失败的话,我会接受这一解释,但它在大多数情况下都是有效的。这一点很好。我可以在这里重现这个问题,奇怪的是,我在实际项目中从来没有遇到过这样的代码结构问题,所以我想知道发生了什么。你启用了最小重建(/Gm)吗?projectB依赖projectA,projectC依赖projectB吗?(右键单击解决方案资源管理器中的项目,选择“项目依赖项”)侧注:显示的代码不足以重现问题,它不会链接。否,所有项目的一致设置都是
/Gm-
@stijn否,因为
A
B
是纯虚拟的。如果它总是失败的话,我会接受这一解释,但它在大多数情况下都是有效的。这一点很好。我可以在这里重现这个问题,奇怪的是,我在实际项目中从未遇到过这种代码结构的问题,所以我想知道到底发生了什么。