Это самый простой пример, который я могу сделать, что иллюстрирует проблему, которую я испытываю.
У нас есть структура файлов:
.
├── 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;
}
оба файла 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
имеет второе замедление "того же" пространства имен:
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(){}
Более интересно, когда я запускаю команду touch в файле B same.hpp и повторно запускаю команду на main.cpp, она работает так, как ожидалось (так же, как и результат, соответствует тому, что мы изначально ожидали). Это оставляет мне поверить, что файл был пропущен по причине, связанной с датой его модификации.
Любое понимание того, почему это происходит?
Проблема была устранена путем вывода уникального комментария в похожих файлах.