实现递归函数,避免由 C++ 中 include 的循环调用(没有 #pragma 一次)引起的无限循环输入
implement recursive function that avoid infinite loop input caused by a circular call of include (no with #pragma once) in c++
>假设我有加载某个文件中的所有包含的函数。我需要用 c++ 编写函数,将所有包含加载到某个给定的源文件中,这样我就可以避免对 include 的无限循环和循环调用。
为了解决这个问题,我必须使用这个函数,我不能使用一次编译指示或类似的东西,我认为可以通过递归来解决,尽管我不确定如何
通常编译器会告诉您文件是否直接或间接包含自身,例如通过#include nested too deeply
这样的错误消息。 要针对特定文件进行测试,假设myprogram.cpp
,您可以使用 g++ 编译器-E
的"仅预处理器"选项:
g++ -E myprogram.cpp
它将解析所有宏和 #includes,并告诉您是否存在您描述的此类递归。
但是,如果它是家庭作业或仅用于您的练习,请注意,#include 可能被其他预处理器指令(如#ifdef ...
)包围,这些指令会影响实际的包含。
如果你被允许忽略这些#ifdef
事情,你可以......
编写一个函数,该函数将文件名作为参数并读取文件的所有行
它维护一个文件名堆栈,并在调用函数 (1) 后将文件名参数推送到此堆栈。
如果一行包含
#include
,请检查要包含的文件是否已在 (2) 的堆栈中。如果是,则表示您检测到 (无休止的)递归。否则,使用该文件名递归调用函数 (1)。运行完 (1) 后从堆栈中获取文件名。
相关文章:
- ArduinoJson 6.15.2:JsonObject没有命名类型
- 如果没有malloc,链表实现将失败
- 数组索引的值没有增加
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 在没有太多条件句的情况下,我如何避免被零除
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 为什么在运行时没有向我们提供有关分段错误的更多信息?
- 有符号的int和int-有没有一种方法可以在C++中区分它们
- 变量没有改变?通过向量的函数调用
- 没有名称的C++模板参数
- 在线编译器中的分段C++没有打印消息
- 没有为自己的结构调用列表推回方法
- 有没有什么方法可以使用一个函数中定义的常量变量,也可以由c++中同一程序中的其他函数使用
- 没有用于初始化C++中的变量模板的匹配构造函数
- 调用'begin(int [n])'没有匹配函数
- 使用C++程序合并排序没有得到正确的输出
- 为什么在这个代码结束循环中没有得到结束
- 如果没有 #pragma pop_macro #pragma push_macro 会发生什么?
- 实现递归函数,避免由 C++ 中 include 的循环调用(没有 #pragma 一次)引起的无限循环输入
- MSVC编译器有没有像"#pragma ignore this sourcefile"这样的东西?