C++ Union,Struct,成员类型

Nic*_*ner 5 c++ struct unions

如果我有课:

class Odp
{
    int i;
    int b;
    union
    {
         long f;
         struct
         {
               WCHAR* pwszFoo;
               HRESULT hr;
         };
    };

}
Run Code Online (Sandbox Code Playgroud)

联盟意味着,在列出的所有值中,它一次只能接受其中一个值?在访问这些变量方面,它如何工作?我如何hr直接访问?如果我设置hr,如果我尝试访问会发生什么f

小智 8

这是C++标准中一个非常令人烦恼的领域 - 基本上是一个联合实例,按照标准只能在任何时候处理,好像它包含一个"活动"成员 - 最后一个写入它.所以:

union U {
   int a;
   char c;
};
Run Code Online (Sandbox Code Playgroud)

然后:

U u;
u.a = 1;
int n = u.a;
u.c = 2;
char c = u.c;
Run Code Online (Sandbox Code Playgroud)

没关系,但是:

U u;
u.a = 1;
char c = u.c;
Run Code Online (Sandbox Code Playgroud)

不是.但是,有大量现有代码表明两者都可以.并且在任何情况下都不会抛出"无效"访问的异常.C++语言特别使用异常(!).

基本上,如果您发现自己在C++代码中使用联合来处理除C库之外的任何东西,那么就会出现问题.


AnT*_*AnT 5

每次您设置(写入)联合体的成员时,实质上就是使其“活跃”。您只能阅读联盟当前活跃的成员。这意味着您有责任以某种方式及时记住哪个成员在每个时刻都处于活动状态。

尝试访问联合体的非活动成员会导致未定义的行为。

另请记住,您的代码不是有效的 C++。C++ 中不存在“匿名结构”这样的东西。您的结构成员必须有一个名称。如果您的编译器接受它,那么它只是您的特定编译器支持的非标准扩展。

  • @Billy ONeal:是的,应该这样做,原因显而易见。由于类型通常不相关,因此其他(非活动)成员很容易以陷阱表示形式结束。这是行为未定义的主要原因(也是明显的)。 (3认同)
  • “陷阱表示” <-- 以前从未听说过这个。+1 (2认同)