命名工会的原因是什么

What is the reason for naming unions?

本文关键字:是什么      更新时间:2023-10-16

如果编译器始终将对象视为匿名对象,而不管是否命名联合,为什么要命名联合?

我的实现如下所示:

typedef struct _DMessageHeader {
    union _msgId {
        unsigned char ucMsgId;
        unsigned short usMsgId;
        unsigned long ulMsgId;
        unsigned long long ullMsgId;
    } msgId;
} DMSG_HDR, *PDMSG_HDR;

我希望能够像这样访问它,但编译器抛出一个错误:

PDMSG_DESC ptMsg->hdr.msgId = id_in;

它只允许我像这样直接访问工会成员:

PDMSG_DESC ptMsg->hdr.msgId.ucMsgId = id_in;

关于为什么会这样,或者我如何通过名称访问工会的任何想法?

它是一种类型的东西。编译器无法将 int 内容转换为联合。但是,您可以重载"="运算符来执行此操作。

我不确定你为什么要在这种情况下使用联合。请注意,在我的 8 位机器上,结构的大小为 64 字节(长篇大论的大小)。

#include <iostream>
using std::cout;
using std::endl;
typedef struct _DMessageHeader {
    union _msgId {
        unsigned char ucMsgId;
        unsigned short usMsgId;
        unsigned long ulMsgId;
        unsigned long long ullMsgId;
    }  msgId;
} DMSG_HDR, *PDMSG_HDR;
int main( int argc , char ** argv, char ** env)
{
    cout<<"sizof DMessageHeader"<<sizeof(DMSG_HDR)<<endl;
    return 0;
}

如果存储在联合 msgid 中的所有内容都是长度不同(1 - 8)字节的单个 ID,具体取决于您的体系结构),并且您没有内存约束,请按如下方式重写结构:

typedef struct _DMessageHeader {
unsigned long long msgId;
} DMSG_HDR, *PDMSG_HDR;
DMSG_HDR hdr;
hdr.msgId = id_in;

此外,我建议阅读此线程以彻底讨论在C++中使用联合。

可能有多种原因:

  • 原始 C 编译器中存在不允许匿名联合的限制。换句话说,C和C++程序都可以使用该结构。
  • 您可能希望使用整个并集(移动、赋值等),这允许您定义此类类型的变量。

因为您的示例中没有使用匿名联合。您已经为结构的联合成员指定了一个名称,msgId ,并且它有成员。您不能直接分配给工会本身,您必须分配给工会的成员。

匿名工会如下:

union {
    int i;
    char c;
};
i = 1;

struct s 
{
    int i1;
    union {
        int i2;
        char c2;
    };
};
s s1.i2 = 5;

结构 s 中的联合没有名称,它的成员可以直接访问。

伊塔:

假设您的变量id_in是一个unsigned char,因为您在有效的示例中将其分配给无符号 char 成员,您为什么期望它有效?

PDMSG_DESC ptMsg->hdr.msgId = id_in;

ptMsg->hdr.msgId 不属于 unsigned char 类型,也不是隐式可转换类型。 ptMsg->hdr.msgId属于 _DMessageHeader::_msgId 型。

"联合是一种特殊的类类型,一次只能容纳一个非静态数据成员。(http://en.cppreference.com/w/cpp/language/union)它是一种类类型,您没有定义转换运算符或构造函数。当然,它不允许分配。