为什么我可以指定结构但不能比较它们

Tom*_*mas 24 c struct compare assign

虽然我是一名长期的C程序员,但我最近才知道可以直接将结构变量分配给另一个而不是使用memcpy:

struct MyStruct a,b;
...
a = b; /* implicit memcpy */
Run Code Online (Sandbox Code Playgroud)

虽然这对于C感觉有点"高级",但它绝对有用.但为什么我不能做平等和不平等比较:

if (a == b) ...
if (a != b) ...
Run Code Online (Sandbox Code Playgroud)

标准是否有任何理由排除这种情况?或者这是一个不一致的 - 否则非常优雅 - 标准?

我不明白为什么我可以替换我的memcpy用于干净的任务,但我必须保持那些丑陋的memcmp到位.

Jon*_*erg 27

根据comp.lang.c常见问题解答:

编译器没有很好的方法来实现结构比较(即支持结构的==运算符),这与C的低级风格一致.一个简单的逐字节比较可以在结构中未使用的"孔"中存在的随机位上创建(这种填充用于保持后面字段的对齐正确).对于大型结构,逐场比较可能需要不可接受的重复代码量.在任何情况下,都不能期望任何编译器生成的比较适当地比较指针字段:例如,将char*字段与strcmp而不是==进行比较通常是合适的.

如果您需要比较两个结构,则必须逐个字段地编写自己的函数.

  • 我知道有充分的理由.我忘记了结构上的洞. (2认同)
  • 您可能还会考虑在结构中有联合时会发生什么.工会很容易复制,但很难比较.当然,元素的逐场比较会浪费,但元素之间的大小/填充差异意味着您不能只比较任何一个元素.确定哪些字节是填充以及哪些字节是相关的变得非常棘手. (2认同)