Почему препроцессор пропускает файл, основываясь на его «модифицированной дате»?

0

Это самый простой пример, который я могу сделать, что иллюстрирует проблему, которую я испытываю.

У нас есть структура файлов:

.
├── 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, она работает так, как ожидалось (так же, как и результат, соответствует тому, что мы изначально ожидали). Это оставляет мне поверить, что файл был пропущен по причине, связанной с датой его модификации.
Любое понимание того, почему это происходит?

Теги:
namespaces
g++
c-preprocessor
include

1 ответ

0
Лучший ответ

Проблема была устранена путем вывода уникального комментария в похожих файлах.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню