Question

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.

Was it helpful?

Solution

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.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top