头文件未刷新 - Visual C++ 2012

6

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

当我更改一个被多个文件包含的头文件时,在构建时更改不会生效。 如果我重新构建所有内容,则更改将生效。

复现步骤:

include.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_

dummy.cpp

#include "include.h"

main.cpp

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

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

这将输出1。

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

  • 需要dummy.cpp文件才能重现错误。在实际应用中,该文件使用include.h,但不使用类A和B(但似乎仍然产生相同的问题; 在dummy.cpp中声明一个具有成员A和B的C类仍将导致问题)。当删除文件dummy.cpp或将其重命名为zdummy.cpp(可能会在main.cpp之后编译),问题就消失了。

  • 我尝试过使用#include guards、pragma once、两者结合以及都不使用,每种情况下都会出现该问题。

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

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


我假设在构建之前你保存了更改(并/或启用了“构建之前自动保存所有文件”选项)? - Drew Hall
有趣的是,在Visual Studio 2012中没有这样的选项。在_build_或_rebuild all_之前,我确保我的更改已保存。我也尝试过在构建或重建之前不保存,但是它会为我保存,因为我可以看到选项卡中文件名右侧的*消失了。 - bonob
2个回答

3

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


头文件是项目的一部分。 - bonob
@3li3,这是不是意味着它会出现在“解决方案资源管理器”中的“头文件”下? - Mark Ransom
是的,它可以,而我的复制项目是从头开始创建的,我在项目中添加了所有3个文件。 - bonob

0

我曾经历过这样的事情。

你使用预编译头文件吗?如果是,请从PCH中删除任何与项目特定相关的头文件。那是一个愚蠢的错误。只在PCH中放置外部、不变的头文件,如C/C++标准头文件、Windows头文件、Boost等。


告诉提问者他们犯了一个“愚蠢的错误”并不太礼貌。 - David Heffernan
我不使用预编译头文件。我有一种感觉认为这可能是原因,但我确信多次排除了预编译头文件的影响。 - bonob
哈哈,我以前也做过那个。这不是他的错。如果他再这样做的话,就会出问题了 :P PCH 可以让编译速度更快,但如果不正确的话,会很麻烦。 - Fábio Gusmão Ribeiro
@DavidHeffernan,而且它在我的问题的第一行中提到了:D。 - bonob

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接