C中临时对象的有效类型

时间:2019-02-17 13:11:02

标签: c language-lawyer type-punning

这是与C标准的defect report 452相关的问题。文档N1888提供了有关原始问题的更多信息,但我不明白为什么会这样说明:

  

6.5.p6中的有效类型规则(描述对象的有效类型的规则)似乎不适用于具有因逗号表达式而导致的临时生命期的对象。因此,它似乎没有有效的类型。 因此,似乎允许键入punning

--mixed

我的问题是,如果由表达式long func3() { union u2 o3 = { .x=42 }; return (0, o3).y; } 创建的具有临时生存期的对象没有有效的类型,那么导致类型修剪成为合法的原因是什么?我相信只有在尝试使用另一种类型访问其存储的值时,该对象的有效类型才有意义,但我看不出这里的情况。

1 个答案:

答案 0 :(得分:0)

  

我相信只有当对象尝试使用另一种类型访问其存储的值时,该对象的有效类型才有意义,但是我看不出这是怎么回事。

但是确实确实尝试使用对象使用其他类型访问其存储的值

union u2 {
    int x;
    long y;
    char ca[2];
  };

成员xy具有不同的类型(即使它们可能具有相同的表示形式)。

  

但是当涉及到工会时,不能说我们通过另一个对象的类型来访问一个对象(我知道对此有一些争论,但是标准中有一条注释允许通过工会对类型进行修剪;我知道注释不是规范性的,但我相信这样做是为了使它有效。

您似乎在参考标准中的注释

  1. 如果用于读取联合对象的内容的成员与上次使用该成员的成员不同 在对象中存储一个值,该对象表示的相应部分将重新解释该值 作为6.2.6中描述的新类型的对象表示形式(有时称为“‘type punning’)。这可能是陷阱的表示形式。

您需要定义 valid 的含义,但是根据以上所述,它不能表示“标准定义的保证行为”,因为它可能导致“陷阱表示” “, 一世。 e。读取后未定义行为。