这是我能做的最简单的例子,它说明了我遇到的问题。
我们的文件结构如下:
.
├── main.cpp
├── root
│ ├── A
│ │ └── same.hpp
│ ├── A.hpp
│ ├── B
│ │ └── same.hpp
│ └── B.hpp
└── root.hpp
主.cpp:
#include "root.hpp"
int main(){}
根.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
缺少“相同”命名空间的第二次减速:
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 上重新运行该命令时,它按预期工作(因为输出与我们最初预期的相符)。这让我相信该文件被跳过的原因与其修改日期有关。
关于为什么会发生这种情况的任何见解?