gpt4 book ai didi

c - 如何在 C 中初始化类型定义 union 的结构?

转载 作者:行者123 更新时间:2023-11-30 15:00:40 24 4
gpt4 key购买 nike

因此,如果我有如下代码:

typedef union {
long integer;
float decimal;
long *integerPtr;
float *decimalPtr;
} Number;

typedef struct Point {
Number x;
Number y;
} Point;

如何初始化它?是不是像下面这样简单呢?我也可以用 const 来做到这一点吗?

Point p = { 100, 100 };
const Point p2 = { 640, 200 };

int someNum, someOtherNum;

Point p3 = { &someNum, &someOtherNum };

仅供引用:我专门针对 C99 之前的 C 代码。

最佳答案

如果您专门针对编译器,您将只能初始化 union 体的第一个元素。好的一点是您不会受到严格的别名规则的困扰。长话短说,将会发生以下情况:

  • 使用整数值初始化:一切都很好,垃圾或变量将转换为长整型,因此这可以正常工作:

    Point p = { 100, 100 };
    const Point p2 = { 640, 200 };
  • 用指针初始化:long 字段将接收转换为 long 的指针值。实际发生的情况尚未明确,但在小端通用体系结构上,如果 long 大于指针,或者在任何 long 与指针大小相同且指针的表示是其整数地址的体系结构上,一切都会好起来的。事实上,您初始化了 long 值,但由于指针表示形式与 long 表示形式相同,因此您得到了预期的结果。因此,这再次按预期工作(在通用架构上):

    int someNum, someOtherNum;
    Point p3 = { &someNum, &someOtherNum };
  • 使用 float 初始化:没有直接的方法,因为将 float 转换为长整数与长整数具有相同的表示形式。但由于严格的别名规则不适用,您可以尝试使用类型双关,前提是 long 的大小与 float 的大小相同:

    float f=12.5, g=1.;
    Point p4 = { *((long *) &f), *((long *) &g) };

关于c - 如何在 C 中初始化类型定义 union 的结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41964158/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com