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

标签 c initialization c89

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

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/

相关文章:

C 字符串追加

c++ - 如何在 C++ 中将十六进制转换为 IEEE 754 32 位 float

c - 用于输入的 fgets()/sscanf 在功能上运行良好。当 fnct 离开并返回时,stdin 中是否有额外的输入/行?

.net - 如何为现有的 c 项目创建 VS 解决方案,以便 VS 自动选择新文件?

c - send() 什么时候返回 EWOULDBLOCK?

c - K&R :C - Stack smashing detected

c++ - 使用默认值初始化 std::array

c++ - 这种初始化语法在即将到来的 c++0x 标准中有效吗?

c++ - 切换大小写后如何阻止变量重置?

c - 在 C (C89) 中获取指向动态库的函数指针