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

implement recursive function that avoid infinite loop input caused by a circular call of include (no with #pragma once) in c++

本文关键字:#pragma 没有 一次 输入 无限循环 调用 循环 递归函数 include C++ 实现      更新时间:2023-10-16

>假设我有加载某个文件中的所有包含的函数。我需要用 c++ 编写函数,将所有包含加载到某个给定的源文件中,这样我就可以避免对 include 的无限循环和循环调用。

为了解决这个问题,我必须使用这个函数,我不能使用一次编译指示或类似的东西,我认为可以通过递归来解决,尽管我不确定如何

通常编译器会告诉您文件是否直接或间接包含自身,例如通过#include nested too deeply这样的错误消息。 要针对特定文件进行测试,假设myprogram.cpp,您可以使用 g++ 编译器-E的"仅预处理器"选项:

g++ -E myprogram.cpp

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

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

如果你被允许忽略这些#ifdef事情,你可以......

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

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

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

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