检索C++程序中的所有函数

Retrieve all the functions in a C++ program

本文关键字:函数 C++ 程序 检索      更新时间:2023-10-16

假设我们有一个定义了函数的C++程序,我们称之为input.cpp

现在,我有了另一个C++程序retrieve.cpp,它必须在运行时"检索"input.cpp中的所有函数(甚至是它的对象文件,如果这有帮助的话!)。

我所说的"检索"是指获得类似std::list<std::string>的东西,其中每个元素都是字符串的头,或者std::list<std::function>或任何其他类似的解决方案。

在这个过程中有良好的表现是很重要的。

我为什么需要它:在这篇文章中,我试图映射一个子集的函数(用户定义的)来实现一个记忆框架。正如有人在评论中建议的那样,映射目标程序中的所有功能可能会更具性能。这个问题来自于枚举/索引程序中所有函数的必要性。

您可以通过查看对象文件的内容来找到所有导出器符号。在Windows上,你可以使用诸如dumpbin之类的程序来实现这一点,而在Linux上,nm就是你要找的droid。

然而,这不会向您显示"内部"符号;对象文件中未导出的符号。

如果你只想要函数的一个子集,并且你控制它们的源代码,你可能会编写某种可怕的宏来将函数的名称存储在某个地方(如果你走这条路,你必须更改你感兴趣的每个函数声明)。我根本不建议这样做,但这是最后的手段。

如果你谈论的是运行时检查,那么听到C++没有任何内置反射的消息,你会很难过。可以通过库提供不同程度的元数据(请参阅此处,但从根本上讲,这是编译器内部需要发生的事情,因为在翻译阶段之后会丢失大量信息。

如果你需要在运行时访问这些信息,那么你最好的选择可能是"预处理"对象文件(使用我前面提到的对象文件检查程序),将其写入一个文件,然后让你的程序读取回这个文件,以构建你提到的std::list

同样值得问问自己为什么要这样做;对于你的实际问题,可能有一个更合适的解决方案(见XY问题)。

更新

现在你已经更新了你的帖子,说明了你为什么要这么做,这一切都更有意义了。如果你想记忆函数调用,那么你可以看看完美的转发和可变模板;您可以存储函数参数的"缓存",如果以前已经用它调用过,则可以返回结果。

你不想在全局范围内应用这一点,因为有些函数不是纯函数(即它们有副作用,记住它们可能会破坏很多代码);确保让用户选择哪些功能是记忆的。