Pourquoi puis-je attribuer struct mais pas les comparer
Question
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:
struct MyStruct a,b;
...
a = b; /* implicit memcpy */
Bien que cela se sent un peu « haut niveau » C, il est certainement utile. Mais pourquoi je ne peux pas faire la comparaison de l'égalité et de l'inégalité:
if (a == b) ...
if (a != b) ...
Y at-il une bonne raison de la norme pour exclure ce? Ou est-ce une incohérence dans la - par ailleurs très élégant - norme?
Je ne vois pas pourquoi je peux remplacer mes memcpy pour des missions de nettoyage, mais je dois garder ceux de laide de memcmp en place.
La solution
Par la comp.lang.c FAQ :
Il n'y a pas de bonne façon pour un compilateur pour mettre en oeuvre la comparaison de la structure (Par exemple pour supporter l'opérateur == pour structures) qui est compatible avec saveur faible niveau C. Un simple octet par octet comparaison pourrait fondateur sur des bits aléatoires présents dans inutilisés « trous » dans la structure (par ex rembourrage est utilisé pour maintenir l'alignement des champs plus tard correct). Une comparaison champ par champ peut nécessiter des quantités inacceptables de le 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 les champs char * correspond avec strcmp plutôt que ==.
Si vous avez besoin de comparer deux structures, vous devrez écrire votre propre fonction de le faire, champ par champ.