【问题标题】:Can I load header(.h) file to get struct at runtime? (C++)我可以加载 header(.h) 文件以在运行时获取结构吗? (C++)
【发布时间】:2021-04-17 03:09:30
【问题描述】:

我想构建一个 C++ 程序,一个共享内存监视器/拦截器/记录器/播放器。 基本上我想实现的那些功能都没有问题。

现在我的主要问题是我想让这个程序能够加载很多不同的 ICD 文件,所以我可以查看不同的共享内存,只需加载共享内存使用 ICD 头文件,所以我不需要包含该 ICD 文件并重新构建此程序。

示例 ICD 头文件 A (A.h):

struct StructA
{
    bool btState;
    float X_Pos;
    float Y_Pos;
    float Rotate;
};

示例 ICD 头文件 B (B.h):

struct StructB
{
    int systemState;
    int missionState;
};

So, when my program startup, it will show a File Selector Dialog like many others program, then user can select a Header File, when select done and write this Shared Memory used name to input field, the UI will show about this结构内容。

喜欢(当 A.h 加载时):

btState false
X_Pos   0.04568f
Y_Pos   456.556f
Rotate  25.258f

那么,我应该像文本文件一样加载这些文件,并构建一个类来进行一些字符串剪切/分析,还是使用 C++ 编译器在运行时编译这个文件?

坦克。

【问题讨论】:

  • C++ 类不能在运行时构建。它们仅存在于 C++ 源代码中,而不存在于运行时代码中。当然,您可以编写这样的代码,就像您将类构建为运行时一样,但是 C++ 语言不会在这方面为您提供任何帮助,您必须自己完成所有工作。
  • 解决方案是使用一个基类,然后从它扩展。关键是您需要编写一个足够通用的基类,以捕获任何派生类可能具有的功能。

标签: c++ compilation header runtime shared-memory


【解决方案1】:

头文件不能在运行时替换,因为它们是在将源代码编译为固定二进制文件的第一步进行评估的。

您正在寻找的是factory pattern

创建一个(纯虚拟)接口类ICD。这应该包含所有常见的数据和成员函数。从中您可以派生类 A_ICD和 B_ICD`(来自标题 A 和 B 的内容)。

根据给定的用户输入,您可以决定是创建对象形式 A_ICD 还是 B_ICD

使用A_ICDB_ICD对象的源代码只使用了接口类ICD,因此不需要知道实例化了哪个类。

【讨论】:

    【解决方案2】:

    如果你真的想要数据结构的运行时定义,任何任意结构,不要使用 C 代码。您必须自己解析它或使用库来解析它,而 C 不适合数据描述。使用 .xml 之类的域文档和一个库来解析它,或者使用专门的数据描述语言,例如 OpenDDL

    附言。在工作中,我们正在解决与网络交互播放程序类似的问题。每次协议稍有改变都重新编译程序是不可接受的,但唯一的数据源确实是用于构建通信程序的头文件。一个简单的结构定义解析器已经完成。

    然后程序将在解析序列后只记住字段的大小和偏移量,并假设内存布局用于从二进制文件中逐个读取字段。由于缺乏创建中间开发文档(机器可读形式的协议文档)的人力,这是一个高度不可移植的解决方案。由于它是不兼容平台之间的网络协议,因此对齐字段和字节顺序的问题已经解决,共享内存将是一个存在的问题。

    【讨论】:

      猜你喜欢
      • 2014-05-04
      • 2018-08-28
      • 2013-11-28
      • 2023-04-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-31
      相关资源
      最近更新 更多