【问题标题】:Call function from arbitrary souce .cpp file using the file name as a string使用文件名作为字符串从任意源 .cpp 文件调用函数
【发布时间】:2017-03-01 21:53:24
【问题描述】:

我正在在线解决编码问题,我想到了一个可以使测试真正高效的系统。我的计划是

  1. 为每个问题提供一个不同的 .cpp 文件,其中包含一个解决问题并将结果输出到 .txt 文件的函数
  2. 创建一个带有 main 函数的 .cpp 文件,该函数接受 2 个命令行参数:一个字符串是我当前正在解决的问题的文件名,一个字符串是要用于该问题的测试用例的文件名。

main 函数首先创建一个 FILE* 来存储测试用例,另一个 FILE* 来创建一个空的输出文件。然后,它从命令行中指定的问题 .cpp 文件中调用该函数。

每个问题文件的函数原型如下所示:

static void Problem(FILE* test_case, FILE* output);

想法是将测试用例传递给特定问题,并让“问题”函数将结果写入输出文本文件。

我已成功运行特定问题的测试用例,并为每次运行获取唯一的输出文件。

但是,我当前的问题是启用 main 函数以使用 .cpp 文件名作为参数。在 C++ 中似乎没有直接的方法可以仅使用文件名从文件中调用函数。我知道预处理器会解析 .cpp 文件并将函数名转换为函数指针。有没有办法在运行时做到这一点?换句话说,我可以流式传输 .cpp 文件,搜索与我的函数原型匹配的行,然后返回指向该函数的指针吗?我可以使用某种宏来提示预处理器将文件名与其功能相关联吗?

到目前为止,从我对答案的搜索来看,最简单的解决方案似乎是创建一个将函数名称与函数匹配的映射。这对我来说似乎很乏味和不雅。我想我还不如每次切换问题时在我的主文件中手动更改函数调用,而不是在命令行中设置文件的名称。我也不喜欢这样做。

【问题讨论】:

  • 其实可以这样做,但这意味着将源代码编译成可加载库,加载库,调用函数,然后保存结果。它涉及将库中的动态链接到要测试的整个应用程序和管理安全问题,这样您就不会打开可测试的应用程序受到攻击。这是表面上看起来很容易但具有层层增加复杂性的问题之一。如果你想继续学习,我建议你学习操作系统课程。
  • 由于你的函数是静态的,它们将不能被任何程序直接调用。即使它们被链接到。
  • Boost.DLL,它允许您将测试用例创建为具有通用接口的“插件”。然后这些测试用例插件可以由主应用程序动态加载。从tutorial 来看,它看起来相当容易使用。

标签: c++ function macros


【解决方案1】:

在标准 C++ 中,没有直接的方法可以做到这一点。但是,大多数实现都提供了在运行时加载库和从这些库调用命名函数的工具。例如,在 Windows 下,您可以调用 LoadLibrary 来加载命名的 DLL,然后调用 GetProcAddress 来获取指向命名的可调用 (C) 函数的指针。其他操作系统提供类似的功能。这并不像看起来那么有用,而且往往会导致代码脆弱。

【讨论】:

  • 也许 Boost.DLL 可以替代直接调用 LoadLibrary 和 GetProcAddress 以减轻“脆弱性”问题。
【解决方案2】:

您的文件可能有一个静态全局类。在其构造函数中将函数地址传递给它。此构造函数更新可由主框架调用的函数的全局向量。如果您需要输入和输出文件名,请将它们添加到构造函数的参数列表和向量中。

【讨论】:

    猜你喜欢
    • 2011-07-12
    • 2015-01-12
    • 2017-09-12
    • 2016-08-17
    • 1970-01-01
    • 1970-01-01
    • 2022-06-28
    • 2021-02-23
    • 1970-01-01
    相关资源
    最近更新 更多