Perchè posso assegnare le strutture ma non confrontarli
Domanda
Anche se io sono un lungo programmatore orario C, ho da poco imparato che si può assegnare direttamente le variabili di struttura tra loro invece di usare memcpy:
struct MyStruct a,b;
...
a = b; /* implicit memcpy */
Anche se questo si sente un po ' "alto livello" per C, è sicuramente utile. Ma perché non posso fare il confronto uguaglianza e disuguaglianza:
if (a == b) ...
if (a != b) ...
C'è qualche buona ragione per lo standard di escludere questo? O si tratta di una contraddizione in - altrimenti molto elegante - di serie?
Non vedo il motivo per cui posso sostituire il mio memcpy di per le assegnazioni pulite, ma devo mantenere quelli brutti memcmp del posto.
Soluzione
Per la comp.lang.c FAQ :
Non v'è alcun buon modo per un compilatore implementare confronto struttura (Cioè per supportare l'operatore == per strutture) che è coerente con sapore a basso livello di C. Un semplice byte per byte confronto potrebbe fondatore il bit casuali presenti in inutilizzata "buchi" nella struttura (per es imbottitura è utilizzato per mantenere l'allineamento di seguito campi corretti). Un confronto campo per campo potrebbe richiedere quantità inaccettabili di codice ripetitivo per grandi strutture. Qualsiasi confronto generato dal compilatore Non ci si poteva aspettare per confrontare campi puntatore giustamente in tutti casi: per esempio, è spesso opportuno confrontare i campi char * con strcmp piuttosto che ==.
Se avete bisogno di confrontare due strutture, dovrete scrivere la propria funzione per farlo, campo per campo.