在处理3D点时,我遇到了这种类型定义的方法:

union point_3d {
    struct {
        GLdouble x, y, z;
    } coord;

    GLdouble tab[ 3 ];
};

因此,坐标可以通过名称和下标来访问,例如可互换地使用p.coord.xp.tab.[0].

这比typedef GLdouble point_3d[3];更有用,因为联合支持直接赋值(当然,我们可以通过名称访问坐标),但也比struct point_3d { glDouble x, y, z; };更有用,因为类型可以直接迭代,而不使用sizeof.

但是,真正重要的问题是:这是否安全?这是便携式的吗?我还没有能够找到任何东西来表明它不是,但我还没有能够证实它是有保证的,所以我在这里问那些希望比我更有知识的人.

(while I am interested to know if this works on Windows, I'm specifically referring to POSIX portability. Windows is only of secondary importance to me)

推荐答案

C允许type-punning个通过unions .

这意味着你可以写入到联合的一个成员(例如 struct ),并从另一个成员(数组)读取.当然是相反的.

最大的可能问题是 struct 是否包含元素之间的填充.如果是这样,它就不匹配array.但在这种情况下不太可能.

C++相关问答推荐

获取二维数组的最大元素

如何避免使用相对路径包含在c中

为什么listen()(在调用accept()之前)足以让应用程序完成3次握手?

ISO_C_BINDING,从Fortran调用C

我可以在C中声明不同长度数组的数组而不带变量名吗?

以下声明和定义之间的区别

文件权限为0666,但即使以超级用户身份也无法打开

Sizeof(&Q;字符串&Q;)的正确输出是什么?

为什么我的Hello World EFI程序构建不正确?

不同出处的指针可以相等吗?

在C语言中,指针指向一个数组

添加函数会 destruct 嵌入式C代码(无IDE)

C语言中神秘的(我认为)缓冲区溢出

C语言中MPI发送接收字符串时出现的分段错误

在吉陀罗中,_2_1_和CONCAT11是什么意思?

为什么会出现此错误?二进制表达式的操作数无效

赋值两侧的后置增量,字符指针

使用 GCC 将一个函数中初始化的 struct 体实例通过指针传递到 C 中的另一个函数会产生不同的结果

定义 int a = 0, b = a++, c = a++;在 C 中定义了行为吗?

我们可以在不违反标准的情况下向标准函数声明添加属性吗?