结构体作为比较操作数的不可用性是C中比较明显的事情之一(对我来说没有多大意义)。结构可以按值传递并通过赋值复制,但没有为它们指定==
。
下面是C11标准(草案)的相关部分,它们定义了相等运算符(==
和!=
)和简单赋值运算符(=
)的约束。注意在等式运算符的约束中缺少结构和联合。 (除了没有处理_Atomic
之外,C99中的措辞是相同的。)
6.5.9平等运营商
约束
以下其中一项应成立:
- 两个操作数都有算术类型;
- 两个操作数都指向兼容类型的限定或非限定版本的指针;
- 一个操作数是指向对象类型的指针,另一个是指向合格或非限定版本的void的指针;或
- 一个操作数是指针,另一个是空指针常量。
6.5.16.1简单分配
约束
以下其中一项应成立:
- 左操作数具有原子,限定或非限定算术类型,右边有算术类型;
- 左操作数具有与权限类型兼容的结构或联合类型的原子,合格或非限定版本;
- 左操作数具有原子,限定或非限定指针类型,并且(考虑左值操作数在左值转换后将具有的类型)两个操作数都是指向兼容类型的限定或非限定版本的指针,以及指向的类型。 left包含右边指向的所有类型的限定符;
- 左操作数具有原子,限定或非限定指针类型,并且(考虑左值操作数在左值转换后将具有的类型)一个操作数是指向对象类型的指针,另一个操作数是指向限定的或void的非限定版本,左边指向的类型具有右边指向的所有类型的限定符;
- 左操作数是原子,限定或非限定指针,右边是空指针常量;或
- 左操作数的类型为atomic,qualified或nonqualified _Bool,右边是指针。
有人可以解释为什么存在这种差异(没有推测)?
答案 0 :(得分:4)
即使允许对这些类型进行赋值,也无法比较结构和联合的相等性。由对齐限制引起的结构和联合中的间隙可能包含任意值,并且对此进行补偿会对相等比较或修改结构和联合类型的所有操作施加不可接受的开销。
来自“C:A参考手册”。在比较结构时,偶数memcmp
可能会失败,原因相同(编译器添加额外的缓冲区空间以进行对齐)。我猜他们可以实现逐个成员比较;为什么他们不是一个不同的问题