Warum kann ich structs zuweisen, sie aber nicht vergleichen,
Frage
Auch wenn ich eine lange Zeit C-Programmierer bin, habe ich erst vor kurzem, dass man direkt Strukturvariablen miteinander statt mit Memcpy zuweisen können:
struct MyStruct a,b;
...
a = b; /* implicit memcpy */
Obwohl dies fühlt sich ein bisschen „High-Level“ für C, es ist auf jeden Fall sinnvoll. Aber warum kann ich Gleichheit und Ungleichheit Vergleich nicht tun:
if (a == b) ...
if (a != b) ...
Gibt es einen guten Grund für den Standard dies auszuschließen? Oder ist dies eine Inkonsistenz in der - ansonsten sehr elegant - Standard?
Ich sehe nicht, warum ich meine Memcpy die für saubere Zuweisungen ersetzen, aber ich muss diese hässlichen memcmp die an Ort und Stelle halten.
Lösung
Per comp.lang.c FAQ :
Es gibt keine gute Möglichkeit für einen Compiler zu implementieren Strukturvergleich (Das heißt der Operator == Unterstützung für Strukturen), die mit im Einklang C Low-Level-Geschmack. Eine einfache Byte-für-Byte-Vergleich konnte Gründer auf zufällige Bits in nicht genutzten „Löcher“ in der Struktur (wie beispiels padding wird verwendet, um die Ausrichtung zu halten spätere Felder korrekt). Ein Feld-für-Feld Vergleich könnte inakzeptable Mengen erfordert von repetitiver Code für große Strukturen. Jeder Compiler generierte Vergleich konnte nicht vergleichen zu erwarten Zeigerfelder in geeigneter Weise in allen Fälle: zum Beispiel, ist es oft entsprechender char * Felder vergleichen mit strcmp statt ==.
Wenn Sie zwei Strukturen zu vergleichen, Sie werden Ihre eigene Funktion schreiben müssen so, Feld für Feld zu tun.