为什么C中的等式表达式中不允许使用结构?

ste*_*nct 6 c standards c99 c11

作为比较操作数的结构不可用是C中更明显的事情之一(对我而言)没有多大意义.结构可以通过值传递并通过赋值复制,但==不是为它们指定的.

下面是C11标准(草案)的相关部分,它们定义了相等运算符(==!=)和简单赋值运算符(=)的约束.注意在等式运算符的约束中缺少结构和联合.(除了_Atomic在C99中没有处理措辞是相同的).

6.5.9平等运营商

约束

以下其中一项应持有:

  • 两个操作数都有算术类型;
  • 两个操作数都是指向兼容类型的限定或非限定版本的指针;
  • 一个操作数是指向对象类型的指针,另一个是指向合格或非限定版本的void的指针; 要么
  • 一个操作数是一个指针,另一个是空指针常量.

6.5.16.1简单分配

约束

以下其中一项应持有:

  • 左操作数具有原子,限定或非限定算术类型,右边有算术类型;
  • 左操作数具有与右侧类型兼容的结构或联合类型的原子,限定或非限定版本;
  • 左操作数具有原子,限定或非限定指针类型,并且(考虑左值操作数在左值转换后将具有的类型)两个操作数都是指向兼容类型的限定或非限定版本的指针,左侧指向的类型具有全部右边指出的那种限定词;
  • 左操作数具有原子,限定或非限定指针类型,并且(考虑左值操作数在左值转换后将具有的类型)一个操作数是指向对象类型的指针,另一个是指向合格或非限定版本的指针void,左边指向的类型具有右边指向的所有类型的限定符;
  • 左操作数是一个原子,限定或非限定指针,右边是一个空指针常量; 要么
  • 左操作数的类型为atomic,qualified或nonqualified _Bool,右边是指针.

任何人都可以解释为什么存在这种差异(没有推测)?

Kov*_*nen 4

即使允许对结构和联合进行赋值,也无法比较结构和联合的相等性。由对齐限制引起的结构和联合中的间隙可能包含任意值,对此进行补偿会给相等比较或修改结构和联合类型的所有操作带来不可接受的开销。

摘自《C:参考手册》。出于同样的原因,甚至memcmp在比较结构时也可能会失败(编译器出于对齐目的添加了额外的缓冲区空间)。我猜他们可以实施逐个成员的比较;为什么他们没有是另一个问题

  • @MM:仅涉及编译器编写者的义务的“极简主义”。因为如果用户必须比较结构,那么她不能只是避免它,而是必须手动编写代码生成“千字节的程序集”,并且最终的应用程序可能比自动生成的代码更加臃肿(编译器知道差距完全正确 - 用户没有!)。但这很可能是该决定背后的原因——我只是想得到比这更官方的确认。 (2认同)