реализовать рекурсивную функцию, позволяющую избежать бесконечного циклического ввода, вызванного циклическим вызовом include (нет с #pragma один раз) в c ++ - PullRequest
0 голосов
/ 25 февраля 2019

Предположим, у меня есть функция, которая загружает все включения в определенном файле. Мне нужно написать функцию на c ++, которая загружает все включения в некотором данном исходном файле, поэтому я буду избегать бесконечного цикла и циклического вызова для включения.

Чтобы решить вопрос, я должен использовать эту функцию, я не могу использовать прагму один раз или что-то подобное, я думаю, что это можно решить с помощью рекурсии, хотя я не уверен, как

1 Ответ

0 голосов
/ 25 февраля 2019

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

g++ -E myprogram.cpp

Это разрешит все макросы и #include, и он сообщит вам, если есть такая рекурсия, которую вы описали.

Если, однако, это домашняя работа или просто для вашей практики, обратите внимание, что #include может быть окружено другими директивами препроцессора, такими как #ifdef ... которые влияют на фактические включения.

Если вам разрешено игнорировать такие #ifdef -вещи, вы можете ...

  1. написать функцию, которая принимает имя файла в качестве параметра и читает все строкифайла

  2. , который поддерживает стек имен файлов и помещает параметр имени файла в этот стек после вызова функции (1).

  3. если строка содержит #include, проверяет, находится ли включаемый файл уже в стеке (2).Если да, вы обнаружили (бесконечную) рекурсию.В противном случае, вызовите функцию (1) рекурсивно с этим именем файла.

  4. возьмите имя файла из стека после завершения выполнения (1).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...