实现递归函数,避免在C ++中由循环调用include(一次不使用#pragma)引起的无限循环输入

时间:2019-02-24 21:13:29

标签: c++ data-structures

假设我具有在特定文件中加载所有包含的函数。我需要用c ++编写在给定的源文件中加载所有包含的函数,因此我将避免对包含的无限循环和循环调用。

要解决这个问题,我必须使用此功能,我不能一次使用编译指示或类似的方法,尽管我不确定如何使用,但我认为可以通过递归来解决

1 个答案:

答案 0 :(得分:0)

通常,编译器会告诉您文件是直接还是间接包含自身,例如出现类似#include nested too deeply之类的错误消息。 要针对特定​​文件进行测试,比如说myprogram.cpp,可以使用g ++编译器的“仅预处理器”选项-E

g++ -E myprogram.cpp

它将解析所有宏和#includes,并告诉您是否存在您描述的这种递归。

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

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

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

  2. 维护文件名堆栈,并在调用函数(1)时将filename参数推入该堆栈。

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

  4. (1)运行结束后,从堆栈中获取文件名。