プリコンパイル済みヘッダーなしで 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_
ダミー.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.hint i = 1
に変更します。ビルドして実行すると、1 が出力されます。再構築して実行すると、2が出力されます。int i = 2
エラーを再現するには、dummy.cppファイルが必要です。実際には、このファイルはinclude.hを使用していますが、クラス A と B は使用していません (ただし、これは何も変更していないようです。dummy.cppでメンバー A と B を持つクラス C を宣言すると、問題が再現されます)。ファイルdummy.cppを削除するか、名前をzdummy.cppに変更すると(おそらくmain.cppの後にコンパイルされます)、問題はなくなります。
インクルードガード、プラグマを1回、両方を使用して試しましたが、いずれも使用しませんでしたが、いずれの場合も問題が再現されました。
Code::Blocks/GCC ではこの問題を再現できません。古いバージョンの Visual Studio は試していません。
何か不足していますか、それとも本当に Visual Studio のバグですか? 後者の場合、既知の回避策はありますか? (すべてのステップでの再構築以外)