c-命名数组元素或联合中的结构和数组

考虑以下结构:

struct Vector4D
{
   union
   {
      double components[4];
      struct { double x, y, z, t; } Endpoint;
   };
};

在我看来,我在WinApi的IPAddress结构中看到了类似的内容.这个想法是让我可以同时使用索引和名称来使用数组组件,例如:

Vector4D v;
v.components[2] = 3.0;
ASSERT(v.Endpoint.z == 3.0) //let's ignore precision issues for now

在C标准中,可以保证POD结构的开头没有“空”空间,也就是说,元素x恰好位于Endpoint结构的beginnig中.目前很好.但是我似乎找不到任何保证,如果有的话,在x和y或y和z等之间将没有空白或填充.但是我还没有签出C99标准.

问题是,如果端点结构元素之间没有空格,那么该想法将行不通.

问题:

>我是对的,确实不能保证这将在C或C中都有效.
>这实际上可用于任何已知的实现吗?换句话说,您知道在其中不起作用的任何实现吗?
>是否有任何标准(我的意思不是特定于编译器的方式)表达相同的想法?也许C 0x对齐功能可能有所帮助?

顺便说一句,这不是我在生产代码中正在做的事情,不用担心,只是好奇.提前致谢.

解决方法:

>是的
>取决于架构的对齐需求和编译器策略
>否,但是您可以做一个对象包装器(但是最终将以.z()而不是.z结尾)

大多数编译器应支持使用编译指示或属性压缩结构.例如#pragma pack.

上一篇:min25筛学习笔记


下一篇:c – 用于端序测试和字节交换的联合hack