如何在 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) };
所以如果我有如下代码:
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) };