问有没有办法可以自动比较结构体?
答没有。编译器没有一种好的方法来实现结构体比较(即支持结构体上的运算符),这与 C 语言的低级特性不符。简单的逐字节比较可能会因为结构体中未使用的“空隙”中的随机位而失败(这种填充用于保持后续字段的正确对齐;参见问题 2.12)。逐字段比较可能会为大型结构体产生大量重复的代码,这可能无法接受。任何编译器生成的比较都不能指望在所有情况下都能恰当地比较指针字段:例如,将 `char *` 字段与 `strcmp` 比较通常比(参见问题 8.2)更合适。==任何编译器生成的比较都不能指望在所有情况下都能恰当地比较指针字段:例如,将char *字段与strcmp进行比较通常比==(参见问题 8.2)。
如果你需要比较两个结构体,你必须编写自己的函数来逐个字段进行比较。
参考:K&R2 Sec. 6.2 p. 129
Rationale Sec. 3.3.9
H&S Sec. 5.6.2 p. 133