26

尽管我是一名长期的 C 程序员,但我最近才知道可以直接将结构变量相互分配,而不是使用 memcpy:

struct MyStruct a,b;
...
a = b; /* implicit memcpy */

虽然这对 C 来说感觉有点“高级”,但它绝对有用。但是为什么我不能做平等和不平等的比较:

if (a == b) ...
if (a != b) ...

标准是否有充分的理由排除这一点?或者这是在 - 否则非常优雅 - 标准中的不一致?

我不明白为什么我可以用我的 memcpy 替换干净的作业,但我必须保留那些丑陋的 memcmp。

4

1 回答 1

27

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

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

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

于 2009-12-10T18:26:36.810 回答