c++ - 实现递归函数,避免在c ++中由循环调用include(没有#pragma once)引起的无限循环输入
问题描述
假设我有在某个文件中加载所有包含的函数。我需要用 C++ 编写函数来加载某个给定源文件中的所有包含,这样我将避免无限循环和循环调用包含。
为了解决我必须使用这个函数的问题,我不能使用 pragma 一次或类似的东西我认为它可以通过递归来解决,虽然我不知道如何
解决方案
通常,编译器会告诉您文件是否直接或间接包含自身,例如通过错误消息(如#include nested too deeply
. 要对特定文件进行测试,比如说 a ,您可以使用g++ 编译器myprogram.cpp
的“preprocessor only”选项:-E
g++ -E myprogram.cpp
它会解析所有的宏和#includes,它会告诉你是否有你描述的这样的递归。
但是,如果它是一个家庭作业或只是为了您的练习,请注意 #include 可能被其他预处理器指令包围,这些指令#ifdef ...
会影响实际包含。
如果允许您忽略此类#ifdef
事情,则可以...
编写一个以文件名为参数并读取文件所有行的函数
它维护一个文件名堆栈,并在调用函数 (1) 后将文件名参数推送到此堆栈。
如果一行包含一个
#include
,则检查要包含的文件是否已经在 (2) 的堆栈中。如果是,您已经检测到(无休止的)递归。否则,使用该文件名递归调用函数 (1)。一旦 (1) 的运行完成,就从堆栈中获取文件名。
推荐阅读
- php - 我需要通过套件 CRM API 链接两个新条目
- javascript - 调用引用对象属性的方法会引发 ReferenceError
- c# - 使用json(反)序列化多个对象时出现空问题
- php - 如何使用 ajax 从 mysql 数据库的引导模式中显示当前插入的数据?
- node.js - 在 nestjs 中更改 JSON 响应
- django - = 和 html 中的 3D 字符 | 非ASCII字符| 引用可打印 | Django 电子邮件模板
- lambda - 使用 groupby 的 print 和 lambda 函数
- android - How to putExtra data from strings.xml
- javascript - 如何使按键在按下时只触发一次?
- c - 返回带有指向内部结构数组的指针成员的结构是否安全?