命名工会的原因是什么
What is the reason for naming unions?
如果编译器始终将对象视为匿名对象,而不管是否命名联合,为什么要命名联合?
我的实现如下所示:
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)它是一种类类型,您没有定义转换运算符或构造函数。当然,它不允许分配。
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- C++避免重复声明的语法是什么
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 实现无开销push_back的最佳方法是什么
- C++从另一个类访问公共静态向量的正确方法是什么
- "throw expression code" 1e7 >返回 d 是什么?投掷标准::overflow_error( "too big" ) : d;意味 着?
- C++中名称篡改的目的是什么
- 在 c++ 中拥有一组结构的正确方法是什么?
- 这个指针和内存代码打印是什么?我不知道是打印垃圾还是如何打印我需要的值
- 是什么阻止DOMTimerCoordinator::NextID进入无休止的循环
- 派生类销毁的最佳实践是什么
- 这个语法std::class<>{}(arg1, arg2) 在C++中是什么意思?
- 通过JNI传递数据数组的最快方法是什么
- "using namespace std;"在C++的作用是什么?
- 在两台机器之间进行时间戳的最佳c++chrono函数是什么
- 文件系统:复制功能的速度秘诀是什么
- 用常见虚拟函数实现的任意组合来实现派生类的正确方法是什么
- 使用QQuickFramebufferObject时同步数据的最佳方式是什么
- 是什么原因导致它无法编译?它是声明签名还是在函数本身的实现中
- 使用不同的CRT将新的C++代码与旧的(二进制)组件隔离开来的最佳方法是什么