首页 > 解决方案 > 静态和重新解释铸造 - 定义的行为?

问题描述

首先,我来自一个“管理”的土地,所以要温柔。我正在尝试创建一个消息传递系统,在我投入太多精力之前,我想确保我对转换的理解是正确的。

假设我有一个名为 header 的 pod 类型并将该 header 放入另一个 pod 类型的消息中,我可以安全地将消息 static_cast 到 header 并将 header 指针重新解释为消息指针吗?

如果我理解正确,投射到 pod 的第一个成员是安全的,并且重新解释投射对于返回到我的原始指针应该是安全的吗?

例子:

struct Header
{
    int m_size;
    int m_type;
};

struct Message
{
    // first member to static cast to..
    Header m_header;
};

// 
int main()
{
    Message msg;
    // cast to the first member, the header.
    auto* hdr = static_cast<Header*>(&msg.m_header);
    // because I know the message by type, safely cast it back to the original message type.
    Message* tmp = reinterpret_cast<Message*>(hdr);
    

    return 0;
}

标签: c++

解决方案


我可以安全地将消息静态转换为标题吗

不,这样的静态演员阵容不正确。不过,类似的重新解释演员阵容将得到很好的定义……只要您陈述的先决条件为真。如果您错误地假设它们,则程序的行为是未定义的。

正如评论中所指出的,您的代码示例静态将标头指针转换为标头指针,该标头指针当然定义明确,但不是您所问的。

并将标头指针重新解释为消息指针?

是的。


推荐阅读