C++ 在C/C+中重新打包结构+;

C++ 在C/C+中重新打包结构+;,c++,gcc,clang,C++,Gcc,Clang,我想对打包和解包结构有一个单一的定义 目的是使用反射将一个转换为另一个。我目前通过重新定义性能与导线格式来实现这一点。必须有两个定义,并在它们之间进行成员复制,以停止这些错误 本着DRY的精神,最好不要有两个定义 C++的标准没有帮助,这是很不幸的,因为包装是以线形形式存在的。 我似乎找不到实现定义的方法来实现这一点 using别名中的\uuu属性(packed))或\pragma pack(1)对其进行包装不会改变包装 我希望除了用YAM(另一个宏)包装东西,还有其他选择 FWIW通过使用u

我想对打包和解包结构有一个单一的定义

目的是使用反射将一个转换为另一个。我目前通过重新定义性能与导线格式来实现这一点。必须有两个定义,并在它们之间进行成员复制,以停止这些错误

本着DRY的精神,最好不要有两个定义

C++的标准没有帮助,这是很不幸的,因为包装是以线形形式存在的。 我似乎找不到实现定义的方法来实现这一点

using别名中的
\uuu属性(packed))
\pragma pack(1)
对其进行包装不会改变包装

我希望除了用YAM(另一个宏)包装东西,还有其他选择

FWIW通过
使用uuu属性uuu((aligned(256))=UnA添加对齐在gcc v10.2上工作。可悲的是,更换包装并不能使人满意

任何我没有发现的聪明的把戏都会很感激的

--马特

本着DRY的精神,最好不要有两个定义

从技术角度来看,这不是一个干燥的问题。两个具有相同成员、顺序相同但填充不同的stuct是两种不同的类型。它们没有任何共同之处,因为它们可能有不同的大小,并且成员可能居住在不同的偏移位置。这是非常明显的

因此,独立的定义是不可避免的。为了减少源代码重复,您可以使用预处理器。但您当然是对的,YAM通常很难看,可能容易出错,而且非常糟糕

取而代之的是使用您首选的代码生成器,并以这种方式消除重复。当然,详细信息取决于该生成器的功能。程序员最方便的解决方案是手动编写非压缩结构。类似于以下内容:

// header.hpp
namespace foo
{
struct Bar
{
    // members ...
};
}
您可能需要某种标记(宏?自定义注释?)来标记需要打包版本的类型。然后让代码生成器解析该标头(可能使用libClang/libTooling)并生成其余的:

// header_packed.hpp
namespace foo::packed 
{
struct __attribute__((packed)) Bar 
{
    // members ...
};

// conversion functions ...
}

第二个最佳的选择是在C++中编写相关的结构,但是在某种类型的DSL中,代码生成器是熟悉的,然后从C++中生成所有的C++。

你可以在WORE上进行WORD格式,跳过打包的结构。如果你不想自己写,有序列化的库。谢谢TED。不是不合理的。我有一些类型接口,可以做一些事情,比如日志记录等。如果有一个支持此类结构定义的解决方案,那就太好了。我可以想象通过反射迭代结构中的变量,并将字节内容作为代理复制到适当大小的结构中,但我希望有一个更好的解决方案多一点“自然”我猜。这是一个公平的答案,也很好的答案,谢谢。虽然编译器允许我们通过一个类型别名来改变对齐方式,但这虽然与布局不同,但却是一种结构上的改变。因为我已经依赖于
hana
的struct宏来进行反射,我怀疑我会用你的
::packeted
建议来改变对齐方式此外,我还有一些代码可以解析第三方标题,将数百个结构转换为反射形式,因此,也许我可以使用注释标记和codegen将其转换为我自己的代码。所有解决方案似乎都有点难看。对齐和打包需要更标准的支持。接受这个答案,因为没有答案;-)