为什么预处理器会根据“修改日期”跳过文件?

时间:2013-10-08 18:44:27

标签: c++ namespaces include g++ c-preprocessor

这是我能说的最简单的例子,说明了我遇到的问题。

我们有一个文件结构如下:

.
├── 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(){}

更有趣的是,当我在B的same.hpp文件上运行 touch 命令,并在main.cpp上重新运行命令时,它按预期工作(因为输出与我们最初的匹配)预期)。这使我相信该文件被删除的原因与其修改日期有关 有关为什么会发生这种情况的任何见解?

1 个答案:

答案 0 :(得分:0)

通过在类似的文件中输出唯一注释来解决问题。