【问题标题】:How to understand the conversion rule when a "pointer to an object type" compares for eqality with a "pointer to a void"?当“指向对象类型的指针”与“指向 void 的指针”比较相等时,如何理解转换规则?
【发布时间】:2017-03-15 20:39:24
【问题描述】:

n1570 6.5.9.5 (Equality operators) 说:

5 ......如果一个操作数是指向对象类型的指针,而另一个是指向限定或非限定版本的 void 的指针,则将前者转换为后者的类型。

如果“前”是“后”是“指向对象类型的指针”和“指向 void 的指针”,那么这意味着,在转换之后,比较发生在两个 void*s 上,根据 6.5.9.2 , 未定义:

2.满足以下条件之一:

两个操作数都有算术类型;

两个操作数都是指向兼容类型的合格或不合格版本的指针;

一个操作数是指向对象类型的指针,另一个是指向限定或非限定版本的 void 的指针;或

一个操作数是一个指针,另一个是一个空指针常量。

这是 N1570 的语言缺陷吗?

【问题讨论】:

  • 如果两个指针都是(或已转换为)void *(无论是合格的还是不合格的),则两个操作数都是兼容的类型。
  • 嗯?您准确地引用了约束的第三种情况。所以约束满足了,一切都很好。这些限制在任何以后的转换之前适用。

标签: c language-lawyer c11


【解决方案1】:

如果“前”是“后”是“指向对象类型的指针”和“指向空的指针”,那么这意味着,转换后,比较发生在两个void*s上,

是的,我当然是这么读的。

根据 6.5.9.2,未定义:

没有。您引用标准的第 6.5.9.2 节,显然是相信您所询问的情况不在该部分列举的替代方案列表中,但您错了。这种替代方案涵盖了这种情况:

一个操作数是指向对象类型的指针,另一个是指向限定或非限定版本的 void 的指针;

这里重要的是要理解指向void的指针指向对象类型的指针,对于

void 类型包含一组空值; 这是一个不完整的对象类型,无法完成。

(6.2.5/19;强调)

6.5.9.2 不应被解释为暗示void 不是对象类型;相反,它说void * 可与所有对象指针类型相媲美,当然也包括其自身。

正如@SouravGhosh 首先观察到的那样,这种替代方案也涵盖了相关情况:

两个操作数都是指向兼容类型的合格或不合格版本的指针

因为每种类型都与自身兼容 (6.2.7/1)。

【讨论】:

  • 你能举一个“指向非对象类型的指针”的例子吗?因为我认为(正如你所指出的那样,这是错误的)唯一这样的类型是void*
  • 实际上不需要那么远。约束必须在之前为实际比较进行任何转换。第 3 条约束正是 OP 的起点。
  • @user3528438,区别是对象指针和函数指针。
  • @user3528438:正如答案明确指出的那样:void is 也是一种对象类型。由于不完整,您不能定义这种类型的变量。也许您应该阅读 C 标准中“对象”的定义。它与典型的 OOPL 不同。
  • @JohnBollinger 这就是我弄错的地方。谢谢!
【解决方案2】:

我从来没有从这个角度想过,但我的理解是,两个void *s是(转换后,根据相等运算符属性)兼容类型。

我的参考是

"- 两个操作数都是指向兼容类型的合格或不合格版本的指针;"

【讨论】:

  • 两个void * 本身不能是兼容的类型。因此,它们在约束中明确列出。
  • @Olaf 先生,我很困惑。考虑到void 作为对象类型,为什么指向void 的两个指针不是兼容的类型指针?抱歉,如果这很愚蠢,但我现在不明白。
  • 另外,如果你不介意(我很确定你不会:)),这就是DV的原因吗?否则,我想从 DV'r 那里得到一个解释,因为语言律师职位上的沉默 DV 是危险的,这可能是一个需要纠正的严重误解的迹象。 :(
  • @Olaf 还有,为什么这会专门针对void?两个指向 int 的指针符合 6.5.9.2 中的第二个项目符号,对吗?那为什么不两个指针指向void呢?
  • 问题是:不完整的类型是否相互兼容?响应。指向不完整类型的指针。抱歉,我现在刚刚有时间检查标准,但我没有找到我假设的证据(尽管对此非常确定)。仍然感觉它们不是(这会自动暗示您不能减去两个 void * 或进行比较,除非是为了相等),但没有证据,我将虚拟编辑文本以删除 DV。
猜你喜欢
  • 2021-07-22
  • 2023-02-09
  • 2017-04-10
  • 2013-10-24
  • 1970-01-01
  • 2014-11-03
  • 2011-12-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多