在 sizeof 运算符上强制编译时错误

Force compile time error on sizeof operator

本文关键字:编译时错误 sizeof 运算符      更新时间:2023-10-16

有时我们有一个 POD 结构,其sizeof具有序列化目的的含义。从我的 PE 解析器中,从示例:

struct dos_header {
    unsigned short magic;
    unsigned short cblp;
    ...
    };

此结构旨在从/序列化到 PE 映像,因此sizeof它的含义,例如,ifstream::read

这当然对非 POD 无效。例如,nt_header:

struct nt_header 
{
    std::uint32_t Signature;
    file_header FileHeader;
    std::variant<optional_header_32, optional_header_64> OptionalHeader;
}

使用 sizeof 进行序列化在技术上是有效的,但在运行时是无意义的,因为结构的大小取决于运行时。

有没有办法强制编译器在此类中使用sizeof时生成编译时错误?

因此,如果我不小心在某处使用了sizeof(nt_header),编译器会警告我。

无法

回避这样一个事实,即只要替代方案是微不足道的可复制的,就对memcpy使用偶数nt_header就可以了。 如果这不是您要用于此类对象的序列化机制...不要? 很容易提供一个处理所有(反(序列化的模板,并且专门用于有时读取较少的数据(并且,在这里,从其他一些上下文信息计算variant的索引(。