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_

ダミー.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 のバグですか? 後者の場合、既知の回避策はありますか? (すべてのステップでの構築以外)

4

2 に答える 2

3

ヘッダー ファイルはプロジェクトの一部である必要があります。そうでない場合でも、プロジェクトはビルドされます。つまり、コンパイラはそれを見つけることができますが、Visual Studio はファイルの日付を追跡しません。

于 2013-04-16T19:32:02.310 に答える