使用 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?如果是后者,是否已知有解决方法?(除了每一步都重新构建)