作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
因此,如果我有如下代码:
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/
我是一名优秀的程序员,十分优秀!