首页 > 解决方案 > 实现递归函数,避免在c ++中由循环调用include(没有#pragma once)引起的无限循环输入

问题描述

假设我有在某个文件中加载所有包含的函数。我需要用 C++ 编写函数来加载某个给定源文件中的所有包含,这样我将避免无限循环和循环调用包含。

为了解决我必须使用这个函数的问题,我不能使用 pragma 一次或类似的东西我认为它可以通过递归来解决,虽然我不知道如何

标签: c++data-structures

解决方案


通常,编译器会告诉您文件是否直接或间接包含自身,例如通过错误消息(如#include nested too deeply. 要对特定文件进行测试,比如说 a ,您可以使用g++ 编译器myprogram.cpp的“preprocessor only”选项:-E

g++ -E myprogram.cpp

它会解析所有的宏和#includes,它会告诉你是否有你描述的这样的递归。

但是,如果它是一个家庭作业或只是为了您的练习,请注意 #include 可能被其他预处理器指令包围,这些指令#ifdef ...会影响实际包含。

如果允许您忽略此类#ifdef事情,则可以...

  1. 编写一个以文件名为参数并读取文件所有行的函数

  2. 它维护一个文件名堆栈,并在调用函数 (1) 后将文件名参数推送到此堆栈。

  3. 如果一行包含一个#include,则检查要包含的文件是否已经在 (2) 的堆栈中。如果是,您已经检测到(无休止的)递归。否则,使用该文件名递归调用函数 (1)。

  4. 一旦 (1) 的运行完成,就从堆栈中获取文件名。


推荐阅读