2009-12-10 7 views
23

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 utilizzare memcpy:Perché posso assegnare le strutture, ma non confrontarli

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

Anche se questo si sente un po '"di alto livello" per C, è decisamente 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 un'incoerenza nello standard - altrimenti molto elegante -?

Non vedo perché posso sostituire i miei memcpy per compiti puliti, ma devo mantenere quei brutti memcmp sul posto.

+3

+1 per aver fatto una domanda che mi ha insegnato qualcosa. –

risposta

27

Per la comp.lang.c FAQ:

non c'è buon modo per un compilatore per implementare comparatore struttura (cioè per supportare l'operatore == per strutture) che è coerente con sapore basso livello di C . Un semplice confronto byte-per-byte può essere trovato nel bit dei "buchi" non utilizzati nella struttura (tale spessore viene utilizzato per mantenere corretto l'allineamento dei campi successivi). Un confronto field-by-field potrebbe richiedere quantità inaccettabili di codice ripetitivo per strutture di grandi dimensioni. Qualsiasi generato dal compilatore confronto non si poteva pretendere di confrontare campi puntatore giustamente in tutti casi: per esempio, è spesso opportuno confrontare i campi char * con strcmp piuttosto che ==.

Se è necessario confrontare due strutture, è necessario scrivere la propria funzione per farlo, campo dopo campo.

+2

Sapevo che c'era una buona ragione per questo. Ho appena dimenticato i buchi nelle strutture. –

+0

Grazie. Capisco l'argomento del padding. Ma l'argomento del campo del puntatore non vale altrettanto per l'assegnazione? – Tomas

+0

@Tomas No, è molto comune avere più puntatori a un singolo oggetto. Considera un albero, con puntatori extra da ogni bambino al suo genitore. –

Problemi correlati