Обычно компилятор сообщает вам, включает ли файл прямо или косвенно сам себя, например, с помощью сообщения об ошибке, например #include nested too deeply
.Чтобы проверить это для конкретного файла, скажем, myprogram.cpp
, вы можете использовать опцию «только препроцессор» -E
компилятора g ++:
g++ -E myprogram.cpp
Это разрешит все макросы и #include, и он сообщит вам, если есть такая рекурсия, которую вы описали.
Если, однако, это домашняя работа или просто для вашей практики, обратите внимание, что #include может быть окружено другими директивами препроцессора, такими как #ifdef ...
которые влияют на фактические включения.
Если вам разрешено игнорировать такие #ifdef
-вещи, вы можете ...
написать функцию, которая принимает имя файла в качестве параметра и читает все строкифайла
, который поддерживает стек имен файлов и помещает параметр имени файла в этот стек после вызова функции (1).
если строка содержит #include
, проверяет, находится ли включаемый файл уже в стеке (2).Если да, вы обнаружили (бесконечную) рекурсию.В противном случае, вызовите функцию (1) рекурсивно с этим именем файла.
возьмите имя файла из стека после завершения выполнения (1).