これは、私が抱えている問題を説明する最も簡単な例です。
次のようなファイル構造があります。
.
├── main.cpp
├── root
│ ├── A
│ │ └── same.hpp
│ ├── A.hpp
│ ├── B
│ │ └── same.hpp
│ └── B.hpp
└── root.hpp
main.cpp:
#include "root.hpp"
int main(){}
root.hpp:
#pragma once
namespace root{
#include "root/A.hpp"
using namespace A;
#include "root/B.hpp"
using namespace B;
}
A.hpp:
#pragma once
namespace A{
#include "A/same.hpp"
using namespace same;
}
B.hpp:
#pragma once
namespace B{
#include "B/same.hpp"
using namespace same;
}
両方の同じ .hpp ファイル:
#pragma once
namespace same{}
main.cpp の前処理後、ソース コードは次のようになると予想されます。
namespace root{
namespace A{
namespace same{}
using namespace same;
}
using namespace A;
namespace B{
namespace same{}
using namespace same;
}
using namespace B;
}
int main(){}
ただし、実行後の実際の出力にg++ -std=c++11 -P -E main.cpp
は、「同じ」名前空間の 2 番目の減速がありません。
namespace root{
namespace A{
namespace same{}
using namespace same;
}
using namespace A;
namespace B{
//... <- where did it go?
using namespace same;
}
using namespace B;
}
int main(){}
さらに興味深いことに、 B の same.hpp ファイルでtouchコマンドを実行し、main.cpp でコマンドを再実行すると、期待どおりに動作します (出力が最初に期待したものと一致するため)。これは、変更日に関連する理由でファイルがスキップされたと私に信じさせます.
なぜこれが起こっているのかについての洞察はありますか?