联合内的多个匿名结构(如 C 中)

问题描述 投票:0回答:1

我在 C 库中找到了这个名为 handmade math 的解决方案:

typedef union hmm_vec2 {
  struct { float X, Y; };
  struct { float U, V; };
  struct { float Left, Right; };
  struct { float Width, Height; };
  float Elements[2];
} hmm_vec2;

在 C 语言中,该解决方案允许您使用不同的名称引用相同的内存。 假设您有一个名为 my_vec2 的变量,您可以说 my_vec2.x、my_vec2.Height、my_vec2[0]

这样做的用途是,您不必为相同的数据结构但具有不同的字段名称定义不同的类型。

你能在 Zig 中做类似的事情吗?我尝试了一下,但没能成功。

这是我尝试过但不起作用的方法。我不明白为什么使用命名空间不能提取字段。

const vec2 = union {
  usingnamespace struct { x: i32, y: i32 };
  usingnamespace struct { w: i32, h: i32 };
  elems: [2]i32,
};
struct union zig
1个回答
0
投票

其中一些可以用

packed union
packed struct
复制,但 Zig 不允许使用
packed union
packed struct
中的数组。

const log = @import("std").log;

const TestUnion = packed union {
    coords: packed struct { x: f32, y: f32 },
    size: packed struct { width: f32, height: f32 },
    // elements: [2]f32, // error: packed unions cannot contain fields of type '[2]f32'
                         // note: type has no guaranteed in-memory representation
};

pub fn main() !void {
    const test_union = TestUnion{ .coords = .{ .x = 1.2, .y = 3.4 } };

    log.info("coords: {}, {}", .{ test_union.coords.x, test_union.coords.y });
    log.info("size: {}, {}", .{ test_union.size.width, test_union.size.height });
}
$ zig build run
info: coords: 1.2e0, 3.4e0
info: size: 1.2e0, 3.4e0
© www.soinside.com 2019 - 2024. All rights reserved.