C++ 生成c++;代码

C++ 生成c++;代码,c++,data-structures,metalanguage,C++,Data Structures,Metalanguage,在提出任何问题之前:我正在处理实际的硬件 我正在寻找一种元语言,它允许我指定字段结构具有不同的位长度的数据结构内容(包括1, 3或24或48位的字段),它将生成C++代码来访问数据。p> 由于太模糊,该问题被搁置,因此我将尽可能明确: 我正在寻找一种语言: 接受简单的结构描述,生成有用的C++代码, 允许精确指定从1位到多个(最多8)字节长的整数,以及数据(通常为字符串) 会让我不再需要改变endianess 产生准确、可预测的输出,不会带来额外的开销(如协议缓冲区) ASN.1听起来很好,

在提出任何问题之前:我正在处理实际的硬件

<>我正在寻找一种元语言,它允许我指定字段结构具有不同的位长度的数据结构内容(包括1, 3或24或48位的字段),它将生成C++代码来访问数据。p> 由于太模糊,该问题被搁置,因此我将尽可能明确:

我正在寻找一种语言:

  • 接受简单的结构描述,生成有用的C++代码,
  • 允许精确指定从1位到多个(最多8)字节长的整数,以及数据(通常为字符串)
  • 会让我不再需要改变endianess
  • 产生准确、可预测的输出,不会带来额外的开销(如协议缓冲区)
ASN.1听起来很好,但它增加了自己的开销(也就是说,我无法生成一个将2个字节分成4个半字节的简单结构)——我要寻找的是一种能够提供结构精确表示的语言

例如,我想抽象一下:

struct Command {
  struct Record {
    int8_t track;
    int8_t point;
    int8_t index;
    int16_t start_position;  // big endian, misaligned
    int32_t length;          // big endian, misaligned;
  } __attribute__((packed)); // structure length = 11 bytes.

  int8_t current       : 1;
  int8_t command       : 7;
  int8_t reserved;
  int16_t side         : 3;  // entire int16_t needs to be
  int16_t layer        : 3;  // converted from big endian, because
  int16_t laser_mark   : 3;  // this field spans across bytes.
  int16_t laser_power  : 3;
  int16_t reserved_pad : 2;
  int16_t laser_tag    : 2;
  int32_t mode_number  : 8;  // again, entire 32 bit field needs to be converted
  int32_t record_count : 24; // from big endian to read this count properly.

  Record records[];
} __attribute__((packed));
上述内容需要精确地打包到包含
8+记录计数*11
字节的结构中,所有内容都是准确形成的,没有额外的数据,没有额外的位或字节设置

以上只是一个例子。它变得很简单,所以我不会用通常有数百个字段的实际结构来阻塞站点。它已被简化,但显示了我期待看到的许多功能(剩下的两个功能是48或64位整数和普通数据(字节[]))


如果这个问题仍然太模糊,请解释我应该在评论中补充什么。谢谢

一个简单的表格可以跟踪各个字段的大小,并用于将每个元素的偏移量旋转到结构中,这听起来是最简单的解决方案。这不会扩展到深度嵌套的结构,但可以调整以支持处理您识别的未分配的位情况

然后,您可以使用它生成常量,甚至是命名属性访问器,以提取和更新各个字段。考虑到单个元素的大小,宏可能会使生活更加艰难,但任何主流编译器都应该内联代码。您可以根据基于模板的实现进行更改

如果您可以对应用程序的两个方面(主机和设备)使用一个通用的表示,以进一步降低转录错误的可能性,那么If将有所帮助

PLC世界有许多不同的布局机制,但这些机制都与它们的生态系统紧密相连,因此没有真正的帮助


交替地,如果你有可用的工具,你可以考虑一些类似ASN 1的结构来表示。在极端情况下,您甚至可以使用开源生成器直接从MIB生成未编码的生成器。

您想在运行时还是构建时指定这些内容?是什么让你的代码无法维护?好的,通常是1。硬件报告的所有内容都是big endian 2。字段大小不同,跨越字节。3.随着协议的发展,更多的新字段出现在保留区域上。4.结构是大的(数百字节)5。引入新字段或字段定义有时会导致问题,特别是当保留区域未减少新字段的位大小时(或当该区域再次跨越多个字节时)6。结构需要_属性_((压缩))。你不会错过的。7.我不是要听你的判断。这个话题已经很难了。一点提示。尝试定义C++中定义的10个24位大Endion字段的精确填充结构。那不是结构。这是30字节和大量的代码。我希望有一种语言,我可以简单地描述这一点,这将为我生成所有的代码。就像我处理协议缓冲区一样。