如何在 C 中初始化 typedef 联合结构?

How do I initialize a struct of typedef'd unions in C?

所以如果我有如下代码:

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 代码。

如果您专门针对 编译器,您将只能初始化联合的第一个元素。好处是您不会被 严格的别名规则 所困扰。长话短说,接下来会发生什么:

  • 用整数值初始化:一切都很好,文字或变量将被转换为长整数,所以这会很好地工作:

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

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

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