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