Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/139.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 实现递归函数,避免在c+中循环调用include(no with#pragma once)所导致的无限循环输入+;_C++_Data Structures - Fatal编程技术网

C++ 实现递归函数,避免在c+中循环调用include(no with#pragma once)所导致的无限循环输入+;

C++ 实现递归函数,避免在c+中循环调用include(no with#pragma once)所导致的无限循环输入+;,c++,data-structures,C++,Data Structures,假设我有一个函数加载所有文件中的所有内容。我需要在C++中编写函数,加载给定源文件中的所有包含,这样我就避免了对包含的无限循环和循环调用。 为了解决这个问题,我必须使用这个函数,我不能使用pragma一次或类似的东西,我认为它可以通过递归来解决,尽管我不确定编译器通常会如何告诉你一个文件是否直接或间接地包含了它自己,例如,通过一条错误消息,如#include嵌套得太深了。 要对特定文件进行测试,比如amyprogram.cpp,可以使用g++编译器的“仅预处理器”选项-E: g++ -E myp

假设我有一个函数加载所有文件中的所有内容。我需要在C++中编写函数,加载给定源文件中的所有包含,这样我就避免了对包含的无限循环和循环调用。
为了解决这个问题,我必须使用这个函数,我不能使用pragma一次或类似的东西,我认为它可以通过递归来解决,尽管我不确定编译器通常会如何告诉你一个文件是否直接或间接地包含了它自己,例如,通过一条错误消息,如
#include嵌套得太深了
。
要对特定文件进行测试,比如a
myprogram.cpp
,可以使用g++编译器的“仅预处理器”选项
-E

g++ -E myprogram.cpp
它将解析所有宏和#include,并告诉您是否存在您描述的递归

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

如果允许您忽略这些
#ifdef
-内容,您可以

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

  • 它维护一个文件名堆栈,并在调用函数(1)后将filename参数推送到该堆栈

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

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


  • 假设我有一组文件,并且在每个文件中都有同一组中的其他文件的include#。假设我有加载某个文件中所有include的函数。我需要编写加载某个给定源文件中所有include的函数,这样我将避免无限循环和循环调用include。为了解决这个问题,我必须使用这个函数,我不能使用pragma一次或类似的东西,我认为它可以通过递归来解决,尽管我不确定你怎么能拥有一个“加载所有包含”的函数,除非你在使用预处理器或编译器。你真正需要做什么?你的实际问题是什么?你为什么认为你必须这样做?请花点时间阅读,以及。最后,请学习如何创建。如果您不在预处理器或编译上工作,则希望加载文件,并避免对include进行无限循环和循环调用。在这种情况下,您不在预处理器或编译上工作,则希望加载文件,并避免对include进行无限循环和循环调用。I想要实现一次作为#pragma_工作的功能吗