在VSS2012下的头文件中修改功能模板时,构建不一致

时间:2016-07-14 15:03:21

标签: c++ debugging visual-studio-2012 compilation linker

我有一个使用多个项目的visual studio解决方案。我发现在调试模式下使用VS2012进行编译/链接会产生奇怪的行为。我有一个项目'X',它有一个头文件“A.h”包含

template <class T>
double Test( const T & in) //first function
{
std::cout<<"1\n";
return 0.0;
}

template <class T>
T Test( const T & in, const bool in) //second function
{
std::cout<<"2\n";
return T(0.0);
}

 void dTest(dataType in)
{
Test(in)
}

void TTest(dataType in);

和“A.cpp”

#include "A.h"
void TTest(dataType in)
{
Test (in, true);
}

然后在解决方案中我称之为TTest和dTest。

按预期打印1和2。

然后我改变代码分别打印3和4;

和build,导致A.cpp的编译。 但是当我运行它时会打印3和2。

我尝试在它到达的第一个函数中放置一个断点。 但是,如果我在第二个函数中设置了断点,调试器会抱怨“断点不会被命中。源代码版本不同”。

我无法在“发布”模式下重现此行为。进行重建会带来正确的行为。为什么我会看到这种行为?为每个项目创建了一个dll文件。它如何从当前代码和以前代码的一部分中获得部分?我正在使用TFS系统。这是否意味着,VS会保留一个与我当前文件不同的中间文件?

对问题的任何见解/解决方案(除了重建/清洁)都表示赞赏 感谢

1 个答案:

答案 0 :(得分:2)

Visual Studio在跟踪依赖项方面做得不好。请参阅How do I make sure that when a .h file is modified, the .cc files including it are compiled automatically in a Release build using Visual Studio 2008?

如果修改.h文件,确保更改生效的唯一安全方法是重建解决方案中的所有项目。

<强> PS

根据我的经验,在调试版本中正确地选择了依赖项。问题仅出在发布版本中。