Categories
assign c compare struct

Why can I assign structs but not compare them

Even though I am a long time C programmer, I only recently learned that one can directly assign structure variables to one another instead of using memcpy:

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

Though this feels a bit “high-level” for C, it is definitely useful. But why can’t I do equality and inequality comparison:

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

Is there any good reason for the standard to exclude this? Or is this an inconsistency in the – otherwise very elegant – standard?

I don’t see why I can replace my memcpy’s for clean assignments, but I have to keep those ugly memcmp’s in place.

Per the comp.lang.c FAQ:

There is no good way for a compiler
to implement structure comparison
(i.e. to support the == operator for
structures) which is consistent with
C’s low-level flavor. A simple
byte-by-byte comparison could founder
on random bits present in unused
“holes” in the structure (such
padding is used to keep the alignment
of later fields correct). A field-by-field comparison might require unacceptable amounts of
repetitive code for large structures.
Any compiler-generated comparison
could not be expected to compare
pointer fields appropriately in all
cases: for example, it’s often
appropriate to compare char * fields
with strcmp rather than ==.

If you need to compare two structures,
you’ll have to write your own function
to do so, field by field.