6

使用 Visual C++ 2012,没有预编译头文件:

当我更改包含在多个文件中的头文件时,构建时不会考虑更改。如果我全部重建,则会考虑更改。

复制案例:

包括.h

#ifndef INCLUDE_H_
#define INCLUDE_H_

class A {
public:
   A(int i) : i_(i) { }
   int i_;
};

class B {
public:
  B(int i = 1) : a_(i) { }
  A a_;
};

#endif INCLUDE_H_

假人.cpp

#include "include.h"

主文件

#include <iostream>
#include "include.h"

int main(int, char**) {
  B b;
  std::cout << b.a_.i_ << std::endl;
  return 0;
}

这输出 1。

现在我更改int i = 1int i = 2in include.h;我构建并运行,它输出 1!我重建并运行,它输出 2。

  • dummy.cpp文件是重现错误所必需的在现实生活中,该文件使用的是include.h但不是 A 类和 B 类(但这似乎并没有改变任何东西;在dummy.cpp中声明一个包含成员 A 和 B 的 C 类仍然会重现问题)。当删除文件dummy.cpp,或者将其重命名为zdummy.cpp(大概会在main.cpp之后编译),问题就消失了。

  • 我尝试了包含警卫,一次编译指示,两个都没有,在每种情况下都会重现问题。

  • 我无法使用 Code::Blocks/GCC 重现此问题;我没有尝试使用旧版本的 Visual Studio。

我是否遗漏了什么或者这真的是 Visual Studio 中的一个错误?如果是后者,是否有已知的解决方法?(除了每一步都重新构建)

4

2 回答 2

3

头文件必须是项目的一部分。如果不是,项目仍将构建,即编译器可以找到它,但 Visual Studio 不会跟踪文件的日期。

于 2013-04-16T19:32:02.310 回答
0

我过去也经历过这样的事情。

你使用预编译的头文件吗?如果您这样做,请从 PCH 中删除任何项目特定的标题。这是一个蹩脚的错误。只在 PCH 中放置外部的、不变的头文件,如 C/C++ 标准头文件、Windows 头文件、Boost 等。

于 2013-04-16T19:46:14.973 回答