2009-12-10 2 views
23

Même si je suis depuis longtemps programmeur C, je ne ai appris récemment que l'on peut assigner directement les variables de la structure à l'autre au lieu d'utiliser memcpy:Pourquoi puis-je attribuer struct mais pas les comparer

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

Bien que ce se sent un peu "haut niveau" pour C, c'est certainement utile. Mais pourquoi je ne peux pas faire l'égalité et la comparaison des inégalités:

if (a == b) ... 
if (a != b) ... 

Y at-il une bonne raison de la norme pour exclure ce? Ou s'agit-il d'une incohérence dans la norme - sinon très élégante -?

Je ne vois pas pourquoi je peux remplacer mes memcpy pour des affectations propres, mais je dois garder ces memcmp laids en place.

+3

+1 pour poser une question qui m'a appris quelque chose. –

Répondre

27

par le comp.lang.c FAQ:

Il n'y a pas de bonne façon pour un compilateur pour mettre en œuvre la comparaison de la structure (ie pour soutenir l'opérateur == pour structures) qui est conforme à la saveur faible niveau de C . Une simple comparaison octet par octet pourrait fonder sur des bits aléatoires présents dans des "trous" inutilisés dans la structure (un tel remplissage est utilisé pour maintenir l'alignement des champs suivants corrects). Une comparaison champ par champ peut nécessiter des quantités inacceptables de code répétitif pour les grandes structures. Toute comparaison généré par le compilateur ne pouvait pas être prévu pour comparer champs de pointeur de manière appropriée dans tous les cas : par exemple, il est souvent approprié de comparer ombles champs * avec strcmp plutôt que ==.

Si vous devez comparer deux structures, vous devrez écrire votre propre fonction , champ par champ.

+2

Je savais qu'il y avait une bonne raison à cela. J'ai juste oublié les trous dans les structures. –

+0

Merci. Je comprends l'argument de remplissage. Mais l'argument du champ pointeur ne convient-il pas également à l'affectation? – Tomas

+0

@Tomas Non, il est très courant d'avoir plusieurs pointeurs sur un seul objet. Considérez un arbre, avec des pointeurs supplémentaires de chaque enfant à son parent. –

Questions connexes