C++ 匿名结构是否更改布局和填充?

C++ 匿名结构是否更改布局和填充?,c++,C++,我正在处理来自遗留接口的匿名结构。在运行时,从外部源填充字段,例如: struct foo { union { struct { int a; }; struct { int b; int c; int d; }; }; }; 联合的想法是,根据外部因素,遗留接口使foo的行为就像它只包含结构1或2一样。C++中的匿名

我正在处理来自遗留接口的匿名结构。在运行时,从外部源填充字段,例如:

struct foo {
    union {
        struct {
            int a;
        };

        struct {
            int b;
            int c;
            int d;
        };
    };
};
联合的想法是,根据外部因素,遗留接口使
foo
的行为就像它只包含结构1或2一样。C++中的匿名联盟是合法的;匿名结构不是。据我所知,匿名结构真正做的就是使其成员对外域可见


匿名结构是否对程序有任何“可见的影响”,或者它只是用于对相关字段进行分组?也就是说,我能不能让它在与前面的代码没有明显区别的情况下,
union{inta;intb;intc;intd;}

联合{int a;int b;int c;int d;}
有4个成员,一次只能有一个处于活动状态。所有4个元素的大小都相同

union {
    struct { int a; };
    struct { int b,c,d };
};

有两个成员,但大小不一样。

如果将其设为
union{int a;int b;int c;int d;}
,则
a
b
c
d
将共享同一地址,并且一次只能“激活”其中一个。另一方面,当前代码为
b
c
d
提供了唯一的地址,因此它们都可以同时使用<代码> SIEZOF(FoO)< /Code >应该禁止任何奇怪的编译器,等于<代码> SIZEOF(int)*3 < /Code >。匿名结构在C++中是不合法的??停止立即触摸该代码,去研究什么是<代码>联合< /Code > s,以及它们是如何工作的。通过你提出的改变,有可能造成灾难性的破坏。@ B.Y.Y.S.“ISO C++禁止匿名结构”是非常清楚的,IMO @ MatteoItalia,如果有法律上的替代品,我正在寻找它。你喜欢依靠编译器扩展来修复遗留问题吗?我想你错过了问题的前半部分:匿名结构会做奇怪的事情吗
union {
    struct { int a; };
    struct { int b,c,d };
};