2009-12-10 12 views
23

Auch wenn ich eine lange Zeit C-Programmierer bin, habe ich erst vor kurzem, dass man direkt Strukturvariablen miteinander statt mit Memcpy zuordnen:Warum kann ich structs zuweisen, aber nicht vergleichen sie

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

Obwohl diese fühlt sich ein bisschen "high-level" für C an, es ist definitiv nützlich. 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 das eine Inkonsequenz im ansonsten sehr eleganten Standard?

Ich sehe nicht, warum ich meine memcpy für saubere Aufgaben ersetzen kann, aber ich muss diese hässlichen Memcmp an Ort und Stelle zu halten.

+3

+1 für das Stellen einer Frage, die mir etwas beibrachte. –

Antwort

27

Per die comp.lang.c FAQ:

Es gibt keine gute Möglichkeit für einen Compiler zu Strukturvergleich zu implementieren (dh den Operator == für Strukturen zu unterstützen), die mit C der Low-Level-Geschmack im Einklang . Ein einfacher Byte-für-Byte Vergleich könnte auf zufälligen Bits in unbenutzten "Löcher" in der Struktur ( Padding wird verwendet, um die Ausrichtung der späteren Felder korrekt) vorhanden sein. Ein Feld-für-Feld-Vergleich könnte unannehmbare Mengen von sich wiederholendem Code für große Strukturen erfordern. Jeder Compiler generierte Vergleich konnte nicht vergleichen Zeigerfelder in geeigneter Weise in allen Fällen gerechnet werden: zum Beispiel, ist es oft entsprechenden char * Felder mit strcmp zu vergleichen, statt ==. Wenn Sie zwei Strukturen vergleichen müssen, müssen Sie Ihre eigene Funktion schreiben, Feld für Feld.

+2

Ich wusste, dass es einen guten Grund dafür gab. Ich habe nur die Löcher in den Strukturen vergessen. –

+0

Danke. Ich verstehe das Padding-Argument. Aber gilt das Pointer-Feld-Argument nicht für die Zuweisung? – Tomas

+0

@Tomas Nein, es ist wirklich üblich, mehrere Zeiger auf ein einzelnes Objekt zu haben. Betrachten Sie einen Baum mit zusätzlichen Zeigern von jedem Kind zu seinem Elternteil. –

Verwandte Themen