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

时间:2016-04-18 10:23:15

标签: c++ function

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

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

通过&#34;检索&#34;我的意思是获取std::list<std::string>之类的内容,其中每个元素都是字符串的标题,或std::list<std::function>或任何其他类似的解决方案。

在这个过程中表现良好非常重要。

为什么我需要它this post我尝试映射函数子集(用户定义)以实现memoization框架。正如有人在评论中建议的那样,映射目标程序中的所有函数可能更有效。这个问题来自于枚举/索引程序中所有函数的必要性。

1 个答案:

答案 0 :(得分:3)

您可以通过查看目标文件的内容找到所有导出器符号。在Windows上,您可以使用诸如dumpbin之类的程序,在Linux上,nm是您正在寻找的机器人。

但是,这不会向您展示&#34;内部&#34;符号;未在目标文件中导出的符号。

如果你只想要一个特定的函数子集并控制它们的源代码,你可能会编写某种可怕的宏来存储函数的名称(你必须更改每个函数声明)如果你沿着这条路走下去,你感兴趣的话)。我根本不推荐这个,但它作为最后的手段。

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

如果您需要在运行时访问此信息,那么您最好的选择可能是&#34;预处理&#34;目标文件(使用我前面提到的目标文件检查程序),将其写入文件,然后让程序读回此文件以构建您提到的std::list

也值得自问为什么你想要这样做;对于你真正的问题,可能会有一个更合适的解决方案(见XY problem)。

<强>更新

现在,您已经更新了自己想要这样做的帖子,这一切都更有意义。如果您正在寻找记忆函数调用,那么您可以查看perfect forwardingvariadic templates;你可以存储一个&#34;缓存&#34;函数参数,如果之前已经调用了结果,则返回结果。

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